Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.10;
Скачать: 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 вся ветка

Текущий архив: 2004.02.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
3-29238
EugeneP
2004-01-19 13:11
2004.02.10
Simple ClientDataSet


3-29219
СлБ
2004-01-08 14:30
2004.02.10
Свой Preview


14-29566
syte_ser78
2004-01-20 16:43
2004.02.10
Кол-во логических дисков


14-29555
barby
2004-01-21 09:16
2004.02.10
Словарь сокращений


1-29329
Layner
2004-01-29 09:00
2004.02.10
Формат времени на разных компьютерах (StrToDate)