WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Как узнать, что курсор покинул границы объекта?

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Как узнать, что курсор покинул границы объекта?
Desant опубликован 04-01-2002 15:22 MSK   Click Here to See the Profile for Desant   Click Here to Email Desant  
Как узнать, что курсор покинул границы объекта? (Timage)
al опубликован 04-01-2002 16:08 MSK     Click Here to See the Profile for al  Click Here to Email al     
Использовать таймер. Можно использовать и SetCapture, но MS не рекомендует этого делать из-за проблем с клавиатурой.
gonzales опубликован 04-01-2002 19:25 MSK     Click Here to See the Profile for gonzales  Click Here to Email gonzales     
Я так понял ты на Delphi пишешь.
Там же есть OnMouseLeave
Desant опубликован 04-01-2002 22:36 MSK     Click Here to See the Profile for Desant  Click Here to Email Desant     
Пишу на С++
Хочу сделать эффект живой кнопочки (при наведении меняется изображение). Вот для этого и нужно вычислять, где находится курсор... А на счёт таймера... можно пример?
gonzales опубликован 04-01-2002 23:27 MSK     Click Here to See the Profile for gonzales  Click Here to Email gonzales     
обработай сообщение ON_MOUSELEAVE
ON_MESSAGE(ON_MOUSELEAVE, Handler)
по default оно не шлётся. для того , чтобы
слалось вызывай
TrackMouseEvent(&TrackEvent); в OnMouseMove

TrackEvent.cbSize = sizeof(TRACKMOUSEEVENT);
TrackEvent.dwFlags=TME_LEAVE | TME_HOVER;
TrackEvent.dwHoverTime=1;
TrackEvent.hwndTrack=m_hWnd;

SUnteXx опубликован 05-01-2002 12:18 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
Люди, вы меня, конечно, извените, но все намного проще! При наведении на область ставишь таймер на 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     Click Here to See the Profile for Desant  Click Here to Email Desant     
А я после всех экспериментов поступил так...
Курсор находится или на одном объекте, или на другом. OnMouseMove от первого объекта, значит курсор покинул второй, или наоборот...
Пришлось правда под первый объект положить второй и сделать его невидимым :)))))
SUnteXx опубликован 07-01-2002 12:48 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
2Desant:
Видел я извращения и сам извращался в прогах, но такое! Вам же привели примеры. Просто в вашем варианте есть один недочет! Ведь мышь может двигаться не через один пиксель и не через два, а через 10 или 20 (или того больше!). Плюс курсор может выскочить за пределы окна и мессаги не будут доходить до контрола №1 и №2. Так что вам либо придется увеличить размеры нижнего (невидимого) контрола или изменить проверку!

ЗЫ
Кстати о птичках! Могу прислать пример на АПИ по скинированным кнопочкам! Там даж есть проскиненная кнопка круглой (или даж произвольной) формы! Будет интересно, то пишите запрос на SUnteXx@pisem.net!

ADK опубликован 08-01-2002 11:13 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
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     Click Here to See the Profile for zlelik  Click Here to Email zlelik     
По моему на этом сервере был класс на который заменялся 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
идентефикаторы картинок.


И все

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.