· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› ...отследить момент появления курсора мыши над контролом и момент

Посл.отвђт Сообщен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