Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.009 c
2-1153126465
oleggar
2006-07-17 12:54
2006.08.06
как достать информацию?


8-1139576928
sco
2006-02-10 16:08
2006.08.06
Алгоритм качественного уменьшения рисунка


2-1153325727
!_SM_!
2006-07-19 20:15
2006.08.06
Типы в Dll


15-1152509704
Ega23
2006-07-10 09:35
2006.08.06
С Днём рождения! 8 июля


2-1152859528
T54
2006-07-14 10:45
2006.08.06
Добавление bmp к exe . . .





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский