![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
уход курсора [D7, Win95/98, Win2k, WinXP]
apic © (2006-09-28 07:42:00)Как мне перехватить событи ухода курсора мыши с какого-либо компонента, в том числе и формы. Есть компоненты сторонних разработчиков но мне нужно без них.
Ketmar (2006-09-28 12:44:00) [1]>[23] pasha_golub(c) 28-Sep-2006, 12:19
>Вообще-то, можно подписаться на сообщения
>WM_MOUSELEAVE & WM_MOUSEHOVER.
можно. но тогда уж лучше хук. %-)
>[24] Игорь Шевченко(c) 28-Sep-2006, 12:21
>SetCapture/ReleaseCapture - просто и надежно
угу. только кнопочки перестанут нажиматься. или начнётся свистопляска с перекидкой захватов.
zamtmn (2006-09-28 12:41:00) [2]>>Вообще-то, можно подписаться на сообщения WM_MOUSELEAVE & WM_MOUSEHOVER. В MSDN описано
TrackMouseEvent в справке D7 написано что работает только начиная с WinNT поэтому никогда не использовал, в мсдн говорится что начиная с Win98, надо будет попробовать:)
>> SetCapture/ReleaseCapture - просто и надежно
если сказать SetCapture/ReleaseCapture!, то да просто и надежно, а если привести пример то наверно появятся вопросы по простоте и надежности:)
Игорь Шевченко (2006-09-28 12:21:00) [3]SetCapture/ReleaseCapture - просто и надежно
pasha_golub (2006-09-28 12:19:00) [4]Вообще-то, можно подписаться на сообщения 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_ сообщения (Кетмар прав) не всегда и везде приходят.
zamtmn (2006-09-28 12:16:00) [5]>>сложнее. и ненадёжней. представь ситуацию: мышь резку уехала за
>>форму. никто на форме никаких WM_MOUSEMOVE не получил, и последний
>>контрол, над которым была мышь, так и не понял, что она уже давно уехала.
по моему это подпадает под ситуацию из [2] "Фиг с ней с формой" если мышь остается на форме то всё сработает
Ketmar (2006-09-28 12:12:00) [6]>[20] zamtmn(c) 28-Sep-2006, 11:57
>мне проще, тебе видимо сложнее:) но это надежней.
сложнее. и ненадёжней. представь ситуацию: мышь резку уехала за форму. никто на форме никаких WM_MOUSEMOVE не получил, и последний контрол, над которым была мышь, так и не понял, что она уже давно уехала.
zamtmn (2006-09-28 11:57:00) [7]да придется всем повесить на ОnMouseMove()
>>ты хочешь сказать, что это проще одного таймера?
мне проще, тебе видимо сложнее:) но это надежней.
>>а насчёт "загружать систему"... даже на моём pIII/600 с таймером в 50 мс система не загружется.
но лишняя работа производится и лишний компонент используется.
Вообще этим вопросом не замарачивался, всегда делал как в [5], и соглошусь с [2] по поводу сторонних компонент
Ketmar (2006-09-28 11:42:00) [8]>[18] zamtmn(c) 28-Sep-2006, 11:24
>поясни почему?
см. [9]. WM_MOUSEMOVE приходит далеко не всем контролам сразу. и вовсе не главной форме. повесь на OnMouseMove() обработчик, и поелозь мышью. увидишь, что как только мышь ушла с компонента, событие вызываться перестало. т.е. перехватчик WM_MOUSEMOVE надо вешать на все контролы формы. ты хочешь сказать, что это проще одного таймера?
а насчёт "загружать систему"... даже на моём pIII/600 с таймером в 50 мс система не загружется.
zamtmn (2006-09-28 11:24:00) [9]>>как я уже говорил, что WM_MOUSEMOVE -- не тот вариант
поясни почему?
Ketmar (2006-09-28 11:15:00) [10]ну, тогда вообще лучше хуками. потому как я уже говорил, что WM_MOUSEMOVE -- не тот вариант. код с хуками проще.
вот и третий способ. %-)
zamtmn (2006-09-28 10:49:00) [11]и вообще, что за меренья пиписьками с переходами на личности, человеку предложили 2 способа, пусть выберает
zamtmn (2006-09-28 10:47:00) [12]>>а это зависит от того, насколько оперативно программа должна реагировать.
я не претендую на супероптимальность моего способа, но то что он сработает всегда вне зависимости от скорости шевеленья мышки и не будет лишний раз грузить систему когда мышка не шевелится а таймер работает, говорит в его пользу
Ketmar (2006-09-28 10:39:00) [13]>[12] zamtmn(c) 28-Sep-2006, 10:32
>но если нужно приход\уход, то он не нужен
конечно. хуки, видимо, считаются более простым выходом. ага?
>[13] zamtmn(c) 28-Sep-2006, 10:33
>кстати какой период для таймера вы предложите
>использовать?
а это зависит от того, насколько оперативно программа должна реагировать.
zamtmn (2006-09-28 10:33:00) [14]кстати какой период для таймера вы предложите использовать?
zamtmn (2006-09-28 10:32:00) [15]>>упорное желание решать задачи неоптимальным
тоже самое могу сказать про таймер. вообщето он применяется когда нужно или засечь время или выждать определенный период. соглашусь с его примененьем если нужно посчитать скорость движенья мыши:), но если нужно приход\уход, то он не нужен
Ketmar (2006-09-28 10:27:00) [16]>[10] zamtmn(c) 28-Sep-2006, 10:18
>что вас заставляет сомневаться в моих умственных
>способностях?
упорное желание решать задачи неоптимальным и без нужды усложнённым способом.
zamtmn (2006-09-28 10:18:00) [17]>>вы, сударь, или неумны, или не читаете сабжа, или не в курсе
что вас заставляет сомневаться в моих умственных способностях? идея юзать таймер везде где только можно?
>>тому же, данный подход всё равно не решает "в том числе и формы"
вы не заметили [2]?
Ketmar (2006-09-28 09:32:00) [18]>[5] zamtmn(c) 28-Sep-2006, 08:33
>>>если "в том числе и формы" -- от по таймеру
>проверять, где был и где сейчас.
>таймер тут как кобыле пятая нога.
вы, сударь, или неумны, или не читаете сабжа, или не в курсе, кому и когда приходит WM_MOUSEMOVE.
или вы предлагаете каждомукопмоненту-наследнику TWinControl вешать этот обработчик? а не проще один таймер положить?
к тому же, данный подход всё равно не решает "в том числе и формы".
apic (2006-09-28 09:04:00) [19]Спасибо! Другой не стал бы объяснять... Теперь более понятно!
zamtmn (2006-09-28 08:50:00) [20]запоминаешь в глобальной переменной предидущего влабельца мыши,
в MouseMove смотришь если текущий контрол<>предидущему влабельцу мыши, вызываешь у него mouse_leave, у себя mouse_enter, обновляешь предидущего владельца мыши.