|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 12, 2004 10:58:06 Можно ли отследить момент появления курсора мыши над контролом и момент покидания курсором этой области, конторол "static", сабклассирован, но нет возможности отслеживать сообщения поступающие родительскому окну. С моментом появления вроде более менее ясно, перехватываем в процедуре сабклассинга WM_MOUSEMOVE.. Но как отследить момент покидания?? |
|
|
Дата: Апр 12, 2004 12:06:28 А что мешает перехватывать WM_MOUSEMOVE и сравнивать координаты мышки с шириной/высотой контрола? :^) |
|
|
Дата: Апр 12, 2004 12:39:45 Snowbit Я могу отловить WM_MOUSEMOVE только для контрола, но не могу(в моём случае) для родительского окна, т.е. когда координаты курсора превысят размеры контрола то соответственно у контрола пропадёт WM_MOUSEMOVE и чего тогда ловить и сравнивать? Хотя мне кажется что приемлемое решение всё-таки есть.. |
|
|
Дата: Апр 12, 2004 12:48:17 WM_NCMOUSEMOVE |
|
|
Дата: Апр 12, 2004 13:05:14 Asterix 1) есть TrackMouseEvent; 2) есть SetCapture; 3) можно запустить поток, для наблюдения за курсором и посылать из него сообщения WM_HOVER/WM_LEAVE. |
|
|
Дата: Апр 12, 2004 14:21:10 Я бы рекомендовал именно SetCapture() |
|
|
Дата: Апр 12, 2004 15:25:53 Т.е. SetCapture и потом уже обрабатывать перемещения курсора чтоб не убежал? |
|
|
Дата: Апр 12, 2004 18:42:41 Это в WindowProc:
case WM_MOUSEMOVE:
{
POINT pnt;
pnt.x=LOWORD(lParam);
pnt.y=HIWORD(lParam);
RECT ButtonRect={0};
ButtonRect.top=73;
ButtonRect.bottom=120;
ButtonRect.right=500;
ButtonRect.left=248;
if (PtInRect(&ButtonRect,pnt))
{
_this->bMouseHover=true;
InvalidateRect(hDlg,&ButtonRect,FALSE);
SetCursor(LoadCursor(NULL,MAKEINTRESOURCE(32649)));
break;
}
else
{
_this->bMouseHover=false;
InvalidateRect(hDlg,&ButtonRect,FALSE);
SetCursor(LoadCursor(NULL,IDC_ARROW));
}
_this->btn1.CheckHover(pnt);
_this->btn2.CheckHover(pnt);
_this->btn3.CheckHover(pnt);
_this->btn4.CheckHover(pnt);
}
break;
А это CheckHover:
bool CTextBtn::CheckHover(POINT pnt)
{
if (PtInRect(&coord,pnt))
{
SetCursor(LoadCursor(NULL,MAKEINTRESOURCE(32649)));
return true;
}
return false;
}
Когда писал код - по какой-то причине отказался от WM_HOVER/WM_LEAVE (по-моему криво поддерживался в некоторых версиях ОС) |
|
|
Дата: Апр 13, 2004 00:29:32 rst Спасибо. Но нет у меня доступа к WindowProc! Думаю с SetCapture всё получится, уже попробовал.. |
|
|
Дата: Апр 13, 2004 02:45:27 Всем спасибо! Получилось всё замечательно, сделал так: .if uMsg == WM_MOUSEMOVE
.if fSetCapt == FALSE
invoke SetCapture, hwndStatic
inc fSetCapt
.endif
mov eax, lParam
mov ecx, eax
and eax, 0FFFFh ; LOWORD(eax)
shr ecx, 16 ; HIWORD(ecx)
.if (ax < 0 || ax > 100) || (cx < 0 || cx > 14)
invoke ReleaseCapture
and fSetCapt, FALSE
.endif |
|
|
Дата: Апр 13, 2004 03:09:33 Asterix: SetWindowsHookEx ??? ;-) |
|
|
Дата: Апр 13, 2004 03:50:10 rst Это вопрос или предложение? Да, я хучу окошко, поэтому и не могу получать все сообщения, а только те которые даёт хук WH_CBT :-) |
|
|
Дата: Апр 13, 2004 11:37:09 · Поправил: rst Asterix - это было недоумение, на твоё заявление, что у тебя нет доступа к WindowProc -) По-моему хуки от SetWindowsHookEx может получать сообщения WM_MOUSEMOVE |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.089 |