Автор
|
Тема: Как узнать, что курсор покинул границы объекта?
|
Desant |
опубликован 04-01-2002 15:22 MSK
Как узнать, что курсор покинул границы объекта? (Timage)
|
al
|
опубликован 04-01-2002 16:08 MSK
Использовать таймер. Можно использовать и SetCapture, но MS не рекомендует этого делать из-за проблем с клавиатурой. |
gonzales
|
опубликован 04-01-2002 19:25 MSK
Я так понял ты на Delphi пишешь. Там же есть OnMouseLeave |
Desant
|
опубликован 04-01-2002 22:36 MSK
Пишу на С++ Хочу сделать эффект живой кнопочки (при наведении меняется изображение). Вот для этого и нужно вычислять, где находится курсор... А на счёт таймера... можно пример? |
gonzales
|
опубликован 04-01-2002 23:27 MSK
обработай сообщение ON_MOUSELEAVE ON_MESSAGE(ON_MOUSELEAVE, Handler) по default оно не шлётся. для того , чтобы слалось вызывай TrackMouseEvent(&TrackEvent); в OnMouseMoveTrackEvent.cbSize = sizeof(TRACKMOUSEEVENT); TrackEvent.dwFlags=TME_LEAVE | TME_HOVER; TrackEvent.dwHoverTime=1; TrackEvent.hwndTrack=m_hWnd; |
SUnteXx
|
опубликован 05-01-2002 12:18 MSK
Люди, вы меня, конечно, извените, но все намного проще! При наведении на область ставишь таймер на 1, к примеру, секунду или меньше, а там проверяешь, в области курсор или нет, и т.д. Вот пример:/* static */ BOOL bMouseOn = 0; void YourTimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { POINT pt; GetCursorPos(&pt); if (WindowFromPoint(pt) != hWnd) { KillTimer(hWnd, idEvent); bMouseOn = 0; SomeFuncrion(0); // курсор вне окна! } } . . . case WM_MOUSEMOVE: { if (!bMouseOn) { bMouseOn = 1; SomeFunction(...); // курсор в окне } SetTimer(hWnd, 30, 30, (TIMERPROC)YourTimerProc); break; } . . .
|
Desant
|
опубликован 06-01-2002 15:00 MSK
А я после всех экспериментов поступил так... Курсор находится или на одном объекте, или на другом. OnMouseMove от первого объекта, значит курсор покинул второй, или наоборот... Пришлось правда под первый объект положить второй и сделать его невидимым :))))) |
SUnteXx
|
опубликован 07-01-2002 12:48 MSK
2Desant: Видел я извращения и сам извращался в прогах, но такое! Вам же привели примеры. Просто в вашем варианте есть один недочет! Ведь мышь может двигаться не через один пиксель и не через два, а через 10 или 20 (или того больше!). Плюс курсор может выскочить за пределы окна и мессаги не будут доходить до контрола №1 и №2. Так что вам либо придется увеличить размеры нижнего (невидимого) контрола или изменить проверку!ЗЫ Кстати о птичках! Могу прислать пример на АПИ по скинированным кнопочкам! Там даж есть проскиненная кнопка круглой (или даж произвольной) формы! Будет интересно, то пишите запрос на SUnteXx@pisem.net! |
ADK
|
опубликован 08-01-2002 11:13 MSK
The TrackMouseEvent function posts messages when the mouse pointer leaves a window or hovers over a window for a specified amount of time.BOOL TrackMouseEvent( LPTRACKMOUSEEVENT lpEventTrack // pointer to a TRACKMOUSEEVENT // structure ); Windows NT: Requires version 4.0 or later. Windows: Requires Windows 98. Вот так, господа. |
zlelik
|
опубликован 08-01-2002 20:14 MSK
По моему на этом сервере был класс на который заменялся CButton, там все просто. При инициализации класса указываешь 4 картинки.Обычная кнопка Нажатая Задизабленная С наведенным курсором И все работает без всяких извратов Так там класс назывался CxSkinButton Вот его метод void SetSkin(UINT normal,UINT down, UINT over=NULL, UINT disabled=NULL,UINT mask=NULL, short drawmode=1,short border=1,short margin=4); где UINT normal,UINT down, UINT over=NULL, UINT disabled=NULL идентефикаторы картинок. И все
|