Форум: "Основная";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
Внизуход курсора Найти похожие ветки
← →
apic © (2006-09-28 07:42) [0]Как мне перехватить событи ухода курсора мыши с какого-либо компонента, в том числе и формы. Есть компоненты сторонних разработчиков но мне нужно без них.
← →
Ketmar © (2006-09-28 08:07) [1]если "в том числе и формы" -- от по таймеру проверять, где был и где сейчас.
← →
apic © (2006-09-28 08:16) [2]Фиг с ней с формой, как от дочерних элементов без таймера, сомневаюсь, что в сторонних компонентах используется таймер
← →
Ketmar © (2006-09-28 08:17) [3]CM_MOUSEENER, CM_MOUSELEAVE. но лучше -- таймер, потому что иногда эти события могут и не приходить.
← →
apic © (2006-09-28 08:20) [4]Слушай, чайник я по ходу, обработчики под WM_ писал, а что такое CM_, и как с ним работать не знаю, если не жалко времени, можно не большой пример?
← →
zamtmn © (2006-09-28 08:33) [5]>>если "в том числе и формы" -- от по таймеру проверять, где был и где сейчас.
таймер тут как кобыле пятая нога.
лучше ченить вроде такого
WM_MouseMove:begin
if (handle<>lastmousehandle) and (lastmousehandle<>0) then
begin
sdmessage(lastmousehandle,MY_WM_MOUSELAVE,0,0);
sdmessage(handle,MY_WM_MOUSEENTER;
lastmousehandle:=handle;
end;
MouseMove(wparam,LOWord(lParam),HIWord(lParam),r);
end;
← →
apic © (2006-09-28 08:44) [6]извини, но ничего не понял
← →
zamtmn © (2006-09-28 08:50) [7]запоминаешь в глобальной переменной предидущего влабельца мыши,
в MouseMove смотришь если текущий контрол<>предидущему влабельцу мыши, вызываешь у него mouse_leave, у себя mouse_enter, обновляешь предидущего владельца мыши.
← →
apic © (2006-09-28 09:04) [8]Спасибо! Другой не стал бы объяснять... Теперь более понятно!
← →
Ketmar © (2006-09-28 09:32) [9]>[5] zamtmn(c) 28-Sep-2006, 08:33
>>>если "в том числе и формы" -- от по таймеру
>проверять, где был и где сейчас.
>таймер тут как кобыле пятая нога.
вы, сударь, или неумны, или не читаете сабжа, или не в курсе, кому и когда приходит WM_MOUSEMOVE.
или вы предлагаете каждому копмоненту-наследнику TWinControl вешать этот обработчик? а не проще один таймер положить?
к тому же, данный подход всё равно не решает "в том числе и формы".
← →
zamtmn © (2006-09-28 10:18) [10]>>вы, сударь, или неумны, или не читаете сабжа, или не в курсе
что вас заставляет сомневаться в моих умственных способностях? идея юзать таймер везде где только можно?
>>тому же, данный подход всё равно не решает "в том числе и формы"
вы не заметили [2]?
← →
Ketmar © (2006-09-28 10:27) [11]>[10] zamtmn(c) 28-Sep-2006, 10:18
>что вас заставляет сомневаться в моих умственных
>способностях?
упорное желание решать задачи неоптимальным и без нужды усложнённым способом.
← →
zamtmn © (2006-09-28 10:32) [12]>>упорное желание решать задачи неоптимальным
тоже самое могу сказать про таймер. вообщето он применяется когда нужно или засечь время или выждать определенный период. соглашусь с его примененьем если нужно посчитать скорость движенья мыши:), но если нужно приход\уход, то он не нужен
← →
zamtmn © (2006-09-28 10:33) [13]кстати какой период для таймера вы предложите использовать?
← →
Ketmar © (2006-09-28 10:39) [14]>[12] zamtmn(c) 28-Sep-2006, 10:32
>но если нужно приход\уход, то он не нужен
конечно. хуки, видимо, считаются более простым выходом. ага?
>[13] zamtmn(c) 28-Sep-2006, 10:33
>кстати какой период для таймера вы предложите
>использовать?
а это зависит от того, насколько оперативно программа должна реагировать.
← →
zamtmn © (2006-09-28 10:47) [15]>>а это зависит от того, насколько оперативно программа должна реагировать.
я не претендую на супероптимальность моего способа, но то что он сработает всегда вне зависимости от скорости шевеленья мышки и не будет лишний раз грузить систему когда мышка не шевелится а таймер работает, говорит в его пользу
← →
zamtmn © (2006-09-28 10:49) [16]и вообще, что за меренья пиписьками с переходами на личности, человеку предложили 2 способа, пусть выберает
← →
Ketmar © (2006-09-28 11:15) [17]ну, тогда вообще лучше хуками. потому как я уже говорил, что WM_MOUSEMOVE -- не тот вариант. код с хуками проще.
вот и третий способ. %-)
← →
zamtmn © (2006-09-28 11:24) [18]>>как я уже говорил, что WM_MOUSEMOVE -- не тот вариант
поясни почему?
← →
Ketmar © (2006-09-28 11:42) [19]>[18] zamtmn(c) 28-Sep-2006, 11:24
>поясни почему?
см. [9]. WM_MOUSEMOVE приходит далеко не всем контролам сразу. и вовсе не главной форме. повесь на OnMouseMove() обработчик, и поелозь мышью. увидишь, что как только мышь ушла с компонента, событие вызываться перестало. т.е. перехватчик WM_MOUSEMOVE надо вешать на все контролы формы. ты хочешь сказать, что это проще одного таймера?
а насчёт "загружать систему"... даже на моём pIII/600 с таймером в 50 мс система не загружется.
← →
zamtmn © (2006-09-28 11:57) [20]да придется всем повесить на ОnMouseMove()
>>ты хочешь сказать, что это проще одного таймера?
мне проще, тебе видимо сложнее:) но это надежней.
>>а насчёт "загружать систему"... даже на моём pIII/600 с таймером в 50 мс система не загружется.
но лишняя работа производится и лишний компонент используется.
Вообще этим вопросом не замарачивался, всегда делал как в [5], и соглошусь с [2] по поводу сторонних компонент
← →
Ketmar © (2006-09-28 12:12) [21]>[20] zamtmn(c) 28-Sep-2006, 11:57
>мне проще, тебе видимо сложнее:) но это надежней.
сложнее. и ненадёжней. представь ситуацию: мышь резку уехала за форму. никто на форме никаких WM_MOUSEMOVE не получил, и последний контрол, над которым была мышь, так и не понял, что она уже давно уехала.
← →
zamtmn © (2006-09-28 12:16) [22]>>сложнее. и ненадёжней. представь ситуацию: мышь резку уехала за
>>форму. никто на форме никаких WM_MOUSEMOVE не получил, и последний
>>контрол, над которым была мышь, так и не понял, что она уже давно уехала.
по моему это подпадает под ситуацию из [2] "Фиг с ней с формой" если мышь остается на форме то всё сработает
← →
pasha_golub © (2006-09-28 12:19) [23]Вообще-то, можно подписаться на сообщения WM_MOUSELEAVE & WM_MOUSEHOVER. В MSDN описано: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/mouseinputreference/mouseinputmessages/wm_mouseleave.asp
CM_ сообщения (Кетмар прав) не всегда и везде приходят.
← →
Игорь Шевченко © (2006-09-28 12:21) [24]SetCapture/ReleaseCapture - просто и надежно
← →
zamtmn © (2006-09-28 12:41) [25]>>Вообще-то, можно подписаться на сообщения WM_MOUSELEAVE & WM_MOUSEHOVER. В MSDN описано
TrackMouseEvent в справке D7 написано что работает только начиная с WinNT поэтому никогда не использовал, в мсдн говорится что начиная с Win98, надо будет попробовать:)
>> SetCapture/ReleaseCapture - просто и надежно
если сказать SetCapture/ReleaseCapture!, то да просто и надежно, а если привести пример то наверно появятся вопросы по простоте и надежности:)
← →
Ketmar © (2006-09-28 12:44) [26]>[23] pasha_golub(c) 28-Sep-2006, 12:19
>Вообще-то, можно подписаться на сообщения
>WM_MOUSELEAVE & WM_MOUSEHOVER.
можно. но тогда уж лучше хук. %-)
>[24] Игорь Шевченко(c) 28-Sep-2006, 12:21
>SetCapture/ReleaseCapture - просто и надежно
угу. только кнопочки перестанут нажиматься. или начнётся свистопляска с перекидкой захватов.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.05 c