Вниз
Скачать: CL | DM;

Отловить перемещение курсора на форме, заваленной компонентами   Найти похожие ветки 

 
Islander   (2004-01-31 21:34) [0]

У меня вся форма заставлена контролами. Можно ли как то отловить перемещения курсора мыши в пределах этой формы? А то очень уж не хочется для каждого компонента обрабатывать OnMouseMove


 
Palladin ©   (2004-01-31 21:38) [1]

обрабатывай WM_MouseMove на форме

TForm=class...
procedure lcMM(var msg:TMessage); message wm_mousemove;
...


 
Islander   (2004-01-31 22:02) [2]

Не, форма не получает сообщение, т.к. вся заставлена контролами. Что делать?


 
Palladin ©   (2004-01-31 22:15) [3]

мда... действительно... ступил...
определи единую процедуру на это событие и назначь всем контролам.

TWinControl.ControlCount, TWinControl.Controls[], рекурсия...


 
Islander   (2004-01-31 22:19) [4]

Я уже почти подошел к решению проблемы. Смотри в чем фишка: сообщения получают контролы, а не форма, значит, они передают их дальше по цепочке и до формы. Т.е. вот так уже работает:

procedure CMMouseenter(var Message: TMessage); message CM_MOUSEENTER;

А насчет способа, который ты предлагаешь: я думал над ним:

1) Слишком напряжно
2) Это перекроет те события, которые я могу назначить в дизайн-тайме


 
Cardinal ©   (2004-01-31 22:27) [5]

Когда надо (OnTimier напр.) отслеживаешь Mouse.CursorPos.


...
var x,y: integer;
...
x:=Mouse.CursorPos.x-{form1.}Left;
y:=Mouse.CursorPos.y-{form1.}Top;
...


 
Palladin ©   (2004-01-31 23:23) [6]

1) напряжено? кому?
2) Так сохраняй предыдущий обработчик для каждого контрола и вызывай его в общем.


 
Almaz ©   (2004-02-01 00:51) [7]

Господа, а не проще ли использовать Application.OnMessage ?

type
TForm1 = class(TForm)
...
private
procedure OnMessage(var Msg: TMsg; var Handled: Boolean);
...
end;

...

implementation

{$R *.DFM}

procedure TForm1.OnMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = WM_MOUSEMOVE then
begin
// ...
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := OnMessage;
end;
...


Правда есть одна тонкость - OnMessage будет срабатывать для всех форм в проекте, но это легко проверить по Msg.hwnd.

Удачи.


 
Германн ©   (2004-02-01 04:30) [8]

2 Almaz © (01.02.04 00:51) [7]
Формально по сабжу Вы, возможно, правы. Но учитывая Islander (31.01.04 22:19) [4] и упоминание в нем CM_MOUSEENTER можно предположить, что автору нужно не столько "перемещение", сколько "в пределах какого контрола" находится "курсор мыши" в данный момент.


 
Almaz ©   (2004-02-01 05:06) [9]


> Германн © (01.02.04 04:30) [8]
> ...
> сколько "в пределах какого контрола" находится "курсор мыши"
> в данный момент.

Ну тогда еще останется вызвать ControlAtPos в OnMessage. И все.

Удачи.



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

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.015 c
7-29620
Иван
2003-11-27 10:51
2004.02.10
Мобильный телефон


14-29563
cyborg
2004-01-19 14:45
2004.02.10
Странная ошибка


4-29675
Neznaika
2003-12-03 20:45
2004.02.10
Корзина


6-29493
Andry
2003-12-08 17:19
2004.02.10
Как определить узлы в сети ?


1-29380
SGU_
2004-01-29 05:51
2004.02.10
Закрытие процесса EXCEL




   Наверх