Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];

Вниз

Edit Control Messages   Найти похожие ветки 

 
Inquirer   (2003-02-10 14:17) [0]

Как в потомке TEditControl перехватывать события типа EM_...
(EM_SCROLLCARET, ...)?


 
Inquirer   (2003-02-10 14:20) [1]

Конструкция типа
procedure EMScrollcaret(var Message: TMessage); message EM_SCROLLCARET;
не отлавливает...


 
Игорь Шевченко   (2003-02-10 14:47) [2]

WndProc ?


 
Inquirer   (2003-02-10 15:38) [3]

Через WndProc проходят Window messages (типа WM_...), а Edit Control messages (EM_...) похоже туда и не забредают...


 
gsu   (2003-02-10 15:51) [4]

а я думал, что WndProc обрабатывает все и вся по окну

typedef struct _WNDCLASSEX { // wc
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX;


 
Inquirer   (2003-02-10 15:59) [5]

Почему WM_VSCROLL отлавливается, а EM_SCROLL нет?

EM_SCROLL - Scrolls the text vertically in a multiline edit control. This message is equivalent to sending a WM_VSCROLL message to the edit control. It is not processed by single-line edit controls.


 
MBo   (2003-02-10 16:05) [6]

by single-line edit controls


 
Inquirer   (2003-02-10 16:08) [7]

именно что для multiline edit control EM_SCROLL и не отлавливается (с WM_VSCROLL все нормально) ...


 
Игорь Шевченко   (2003-02-10 16:21) [8]

Через WndProc приходит все, что обрабатывает окно конкретного класса.


 
Inquirer   (2003-02-10 16:36) [9]

ОК, я погорячился, через WndProc действительно все проходит (если послать message напрямую Edit.Perform(EM_SCROLLCARET,0,0), то перехат есть).
Перефразирую вопрос почему, когда я перемещаю курсор в Edit не передается EM_SCROLLCARET?


 
Игорь Шевченко   (2003-02-10 16:44) [10]

An application sends an EM_SCROLLCARET message to scroll the caret into view in an edit control.

Понятно ? Это ты его должен посылать, а не он тебе.


 
Inquirer   (2003-02-10 17:08) [11]

Весь сыр-бор из-за того, что я хотел отловить момент перемещения курсора в Edit"е одним действием (вместо использования двух событий OnKeyDown и OnClick)...
Спасибо всем за соучастие :-)


 
Inquirer   (2003-02-10 17:12) [12]

... чтобы отобразить в статус-строке текущие координаты курсора в Edit"е...


 
Inquirer   (2003-02-10 18:43) [13]

Кстати, а как определить текущую позицию курсора в TEdit кроме как c помощью SelStart?


 
Sha   (2003-02-11 10:20) [14]

SelStart+SelLength :)


 
Anatoly Podgoretsky   (2003-02-11 10:35) [15]

Inquirer (10.02.03 18:43)
А зачем еще что то изобретать, SelStart штатное средство, в комбинации с SelLength


 
Inquirer   (2003-02-11 10:46) [16]

Если выделять текст справа налево -> CaretPos = SelStart;
Если слева направо -> CaretPos = SelStart + SelLength;
как отследить какое выражение использовать? :-)


 
Sha   (2003-02-11 11:04) [17]

2 Inquirer (11.02.03 10:46)

Я это когда-то делал, запоминая предыдущее состояние.
Придется повозиться.


 
Anatoly Podgoretsky   (2003-02-11 11:18) [18]

Если ты хочешь использовать именно CaretPos то ничего мудрить не надо, оно уже показывает точную позицию в кординатах каретки
Если ты хочешь в терминах позиция символа, то EM_CHARFROMPOS


 
Anatoly Podgoretsky   (2003-02-11 11:19) [19]

Попробуй точно объясниться, что ты хочешь, а то постоянно задаешь головоломки по разгадыванию твоиъ мыслей.


 
Sha   (2003-02-11 11:29) [20]

Похоже, он хочет знать где реально находится курсор.
У TEdit нет CaretPos, у TMemo CaretPos есть, но дает не то.


 
Inquirer   (2003-02-11 11:38) [21]

>> Anatoly Podgoretsky
Прошу прощения за misunderstanding,
>>Если выделять текст справа налево -> CaretPos = SelStart;
>>Если слева направо -> CaretPos = SelStart + SelLength;
под CaretPos я имел ввиду просто переменную, куда сохраняется позиция курсора в однострочном TEdit"е (не свойство CaretPos в TMemo)... А нужна мне всего-то текущая позиция мигающего знака вставки в однострочном TEdit"е, т.к. SelStart+SelLength не всегда корректен (см. выше)

>> Sha
Вы все правильно поняли, спасибо.


 
Anatoly Podgoretsky   (2003-02-11 11:40) [22]

Ну тогда возможно поможет GetCaretPos


 
Sha   (2003-02-11 11:46) [23]

По-моему, без запоминания предыдущего положения курсора ничего не выйдет.


 
Inquirer   (2003-02-11 11:51) [24]

>> Anatoly Podgoretsky
GetCaretPos существует опят-таки только для TMemo, но не для TEdit...

По всей видимости Sha прав...


 
Игорь Шевченко   (2003-02-11 11:58) [25]

GetCaretPos существует для любого окна, имеющего каретку.


 
Sha   (2003-02-11 12:02) [26]

Проблема только в том, что GetCaretPos всегда возвращает координаты левой границы выделенной области.


 
Inquirer   (2003-02-11 12:27) [27]

Связка GetCaretPos(WinAPI) + EM_CHARFROMPOS сработала корректно!!

СПАСИБО ВСЕМ ЗА ПОМОЩЬ.


 
Sha   (2003-02-11 12:38) [28]

2 Inquirer (11.02.03 12:27)

Работающий код можно посмотреть?


 
Inquirer   (2003-02-11 12:51) [29]

var
CarPos: TPoint;
X: integer;
begin
// получаем текущее положение каретки в экранных координатах
Windows.GetCaretPos(CarPos);
// получаем текущее положение каретки в координатах символа
X := Edit1.Perform(EM_CHARFROMPOS,0,MakeLParam(CarPos.X, CarPos.Y)) + 1;
end;


 
Sha   (2003-02-11 13:30) [30]

2 Inquirer (11.02.03 12:51)

Действительно работает.
Получается, что GetCaretPos всегда возвращает реальные координаты каретки. Я почему-то считал иначе.


 
Anatoly Podgoretsky   (2003-02-11 13:37) [31]

Естественно реальные, поскольку Получить Позицию Каретки


 
Sha   (2003-02-11 14:52) [32]

2 Anatoly Podgoretsky © (11.02.03 13:37)

SelStart попутал. Это он все время возвращает левые координаты и других туда же тянет :)
Давно с этим возился. Подзабыл. Star стал :)


 
Inquirer   (2003-02-11 15:14) [33]

Кстати свойство CaretPos для TMemo при расчете координат отталкивается тоже от EM_GETSEL, поэтому при выделениии тоже не всегда возвращает корректные координаты...
Победил аналогично как для TEdit

function TMyMemo.GetCaretPos: TPoint; override;
begin
// получаем текущее положение каретки в экранных координатах
Windows.GetCaretPos(Result);
// получаем текущее положение каретки в координатах символа
Result.X := LongRec(Perform(EM_CHARFROMPOS,0,MakeLParam(Result.X, Result.Y))).Lo + 1;
Result.Y := LongRec(Perform(EM_CHARFROMPOS,0,MakeLParam(Result.X, Result.Y))).Hi + 1;
Result.X := Result.X - Perform(EM_LINEINDEX, -1, 0);
end;


 
Inquirer   (2003-02-11 15:22) [34]

Oops, чепуха при скроллировании...


 
Inquirer   (2003-02-11 15:35) [35]

Так правильно :-)

function TMyMemo.GetCaretPos: TPoint; override;
var
Pos: LongRec;
begin
// получаем текущее положение каретки в экранных координатах
Windows.GetCaretPos(Result);
// получаем текущее положение каретки в координатах символа
Pos := LongRec(Perform(EM_CHARFROMPOS, 0, MakeLParam(CarPos.X, CarPos.Y)));

Result.Y := Pos.Hi + 1;
Result.X := Pos.Lo + 1 - Perform(EM_LINEINDEX, -1, 0);
end;


 
Inquirer   (2003-02-11 16:06) [36]

GetCaretPos отрабатывает только в клиентских координатах окна :(



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.009 c
14-30605
cyborg
2003-03-26 01:53
2003.04.10
Не понимаю я Буша


6-30504
stur
2003-02-17 16:32
2003.04.10
ClientSocket , режим NonBlocking. Где обработать исключение?


7-30620
HardClubber
2003-02-15 21:25
2003.04.10
CD ROM. проиграть трэк


14-30581
Ильдар
2003-03-25 10:07
2003.04.10
vcldb60.bpl


14-30577
Феликс
2003-03-25 00:13
2003.04.10
Сильные правят миром!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский