Форум: "Начинающим";
Текущий архив: 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