Форум: "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.008 c