Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


logslava ©   (2006-07-21 16:10:00) 

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


KilkennyCat   (2006-07-21 22:59:00) [1]

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


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

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


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

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

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


KilkennyCat   (2006-07-21 22:05:00) [3]

или вообще урощаем до:
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;

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


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

> 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 21:55:00) [5]

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


Loginov Dmitry   (2006-07-21 21:36:00) [6]

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


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


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

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


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

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

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


Ketmar   (2006-07-21 21:16:00) [9]

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


Loginov Dmitry   (2006-07-21 20:18:00) [10]

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


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


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

 
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;


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


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


fMouseOver - это что?


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

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


PSPF2003   (2006-07-21 16:15:00) [14]

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;

Разберешся?


Наверх

Титульная страница Поиск, карта сайта Написать письмо