Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.06;
Скачать: CL | DM;

Вниз

Как отловить движение мыши   Найти похожие ветки 

 
logslava   (2006-07-21 16:10) [0]

Мне нужно отловить моменты, когда пользователь наводит мышь на определенную часть окна или убирает мышь.
У контролов есть методы OnMouseMove и пр. В том числе есть OnMouseMove и у формы. Только если на форме лежит панель и мы наводим мышь на эту панель, событие не генерируется. А хотелось бы.
Нашел АПИшные WM_MOUSELEAVE и WM_MOUSEHOVER - то что нужно, только не знаю как их пользовать. Подскажите (с примерами, если можно) как писать процедуры, которые бы ловили такие WM?
Спасибо...


 
PSPF2003 ©   (2006-07-21 16:15) [1]

Procedure WndProc(var Message : TMessage); override;
   // Таким способом компонент определяет - находится ли курсор мышки на нём или нет
   // Если курсор за пределами кнопки, то она всё равно продолжает принимать сообщения мышки.
   // Так же кнопка будет принимать сообщения, если на родительском окне нет фокуса.

{--------------------------------------------------------------------}
// Эта процедура перехватывает события мышки, если она даже за пределами кнопки
// Перехватываем оконные сообщения
Procedure TNewButton.WndProc(var Message : TMessage);

Var
  P1,P2 : TPoint;
  Bo    : Boolean;

Begin
If Parent <> nil then
  Begin
  GetCursorPos(P1); // Получаем координаты курсона на экране
  P2 := Self.ScreenToClient(P1); // Преобразуем их в координаты относительно кнопки
  If (P2.X > 0) and (P2.X < Width) and
     (P2.Y > 0) and (P2.Y < Height) then
     Bo := True // Курсор мышки в области кнопки
  else
     Bo := False; // Курсор мышки за пределами кнопки

  If Bo <> fMouseOver then // не перерисовываем кнопку без необходимости.
     Begin
     fMouseOver := Bo;
     Invalidate;
     End;
  End;
inherited WndProc(Message); // отправляем сообщение остальным получателям
End;

Разберешся?


 
logslava   (2006-07-21 16:18) [2]

щас постараюсь вникнуть


 
logslava   (2006-07-21 16:47) [3]


> If Bo <> fMouseOver then // не перерисовываем кнопку без
> необходимости.


fMouseOver - это что?


 
Юрий Зотов ©   (2006-07-21 16:51) [4]

 
TForm1 = class(TForm)
private
 procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
 procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
 procedure ShowMouseControl;
end;

procedure TForm1.CMMouseEnter(var Message: TMessage);
begin
 inherited;
 ShowMouseControl
end;

procedure TForm1.CMMouseLeave(var Message: TMessage);
begin
 inherited;
 ShowMouseControl
end;

procedure TForm1.ShowMouseControl;
var
 W: TWinControl;
 C: TControl;
begin
 W := FindVCLWindow(Mouse.CursorPos);
 if W <> nil then
 begin
   C := W.ControlAtPos(W.ScreenToClient(Mouse.CursorPos), True);
   if C <> nil then
     Caption := C.Name
   else
     Caption := W.Name
 end
 else
   Caption := "?"
end;


 
Loginov Dmitry ©   (2006-07-21 20:18) [5]

> // Эта процедура перехватывает события мышки, если она даже
> за пределами кнопки


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


 
Ketmar ©   (2006-07-21 21:16) [6]

>Юрий Зотов ©   (21.07.06 16:51) [4]
CM_MOUSExxx -- штука хорошая, но иногда не срабатывает. конкретных случаев уже не упомню, но помню, что было. %-)


 
Юрий Зотов ©   (2006-07-21 21:18) [7]

> Ketmar ©   (21.07.06 21:16) [6]

При резком движении через границу контрола.


 
Юрий Зотов ©   (2006-07-21 21:29) [8]

PS
begin
 Я также в курсе, что в приведенном коде метод ShowMouseControl может вызываться дважды подряд.
end


 
Loginov Dmitry ©   (2006-07-21 21:36) [9]

> При резком движении через границу контрола.


Даже не через границу контрола, а через рамку формы. (Хотя если прога работает под отладчиком, то бывает и с контролами - конкретно - TSpeedButton, TActionToolBar). Видать, отладчик кривит.


 
KilkennyCat ©   (2006-07-21 21:55) [10]

Можно дополнительно увеличить стабильность, отлавливая на всех контролах.


 
KilkennyCat ©   (2006-07-21 22:00) [11]

> If (P2.X > 0) and (P2.X < Width) and
>     (P2.Y > 0) and (P2.Y < Height) then
>     Bo := True // Курсор мышки в области кнопки
>  else
>     Bo := False; // Курсор мышки за пределами кнопки


почему не так:
Bo := (P2.X > 0) and (P2.X < Width) and (P2.Y > 0) and (P2.Y < Height);


 
KilkennyCat ©   (2006-07-21 22:05) [12]

или вообще урощаем до:
If (P2.X > 0) and (P2.X < Width) and
  (P2.Y > 0) and (P2.Y < Height) then
 If not fMouseOver then Begin
  fMouseOver := true;
  Invalidate;
End;

Одной переменной меньше...


 
Юрий Зотов ©   (2006-07-21 22:20) [13]

> KilkennyCat ©   (21.07.06 22:05) [12]  

if PtInRect(P2, BoundsRect)...
:o)


 
KilkennyCat ©   (2006-07-21 22:59) [14]

> [13] Юрий Зотов ©   (21.07.06 22:20)


Ну дык, нет предела совершенству! :)

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



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

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

Наверх




Память: 0.5 MB
Время: 0.051 c
15-1152272599
kozhanov
2006-07-07 15:43
2006.08.06
Рукописная доверенность на(в) Украине на управление ТС


2-1153351176
batya17
2006-07-20 03:19
2006.08.06
Закрытие окна


2-1152867059
Levin_610
2006-07-14 12:50
2006.08.06
Сервис


1-1150961942
webpauk
2006-06-22 11:39
2006.08.06
Определение hyperlink


15-1152114162
mac117
2006-07-05 19:42
2006.08.06
Ошибка доступа к XML файлу через msxml