Как организовать mouse hover и leave для отдельных кнопок?

Картежник
Дата: 15.04.2015 07:11:09
у меня сейчас WM_MOUSEHOVER и WM_MOUSELEAVE работают только для формы.т.е. когда я перехожу на кнопку вызывается WM_MOUSELEAVE , наверное потому что считается что покинул основное окно
MasterZiv
Дата: 15.04.2015 08:52:35
Картежник,

главный секрет наверное в том, что сообщения кнопки посылаются, как ни странно, самой кнопке, а не диалогу, где она расположена. Поэтому чтобы это обработать, надо наследовать кнопку, и там это обрабатывать.
Картежник
Дата: 15.04.2015 18:35:39
MasterZiv
Картежник,

главный секрет наверное в том, что сообщения кнопки посылаются, как ни странно, самой кнопке, а не диалогу, где она расположена. Поэтому чтобы это обработать, надо наследовать кнопку, и там это обрабатывать.


аха точно получилось через наследование.
теперь получилось так что у меня 4 кнопки, для 4-х кнопок создаю bool hover[1..4] , и для каждой из кнопок создаю callback функцию, потому что что у каждой кнопки свой размер и своя картинка(из ресурса). можно ли как то одну callback функции назначить всем 4-ем кнопкам?
MasterZiv
Дата: 16.04.2015 10:37:37
Картежник,

код покажи...
Картежник
Дата: 16.04.2015 11:54:20
MasterZiv
Картежник,

код покажи...


примерно так
...

LRESULT CALLBACK ButProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ButProc1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ButProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ButProc3(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
...
bool hov=false,hov1=false,hov2=false,hov3=false;

HWND hWndButton;
HWND hWndButton1;
HWND hWndButton2;
HWND hWndButton3;


WNDPROC lpfnOldWndProc,lpfnOldWndProc1,lpfnOldWndProc2,lpfnOldWndProc3;

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){

...

	hWndButton=CreateWindowEx(NULL, 
		"BUTTON",
		"X",
		
		WS_TABSTOP|WS_CHILD|BS_DEFPUSHBUTTON|WS_VISIBLE|BS_OWNERDRAW,
		wndwd-25,
		5,
		20,
		20,
		hWnd,
		(HMENU)IDC_CLOSE_BUTTON,
		GetModuleHandle(NULL),
		NULL);
	lpfnOldWndProc = (WNDPROC)SetWindowLong(hWndButton,
                 GWL_WNDPROC, (DWORD) ButProc);
	
	hWndButton1=CreateWindowEx(NULL, 
		"BUTTON",
		"Повторить",
		WS_TABSTOP|WS_CHILD|BS_DEFPUSHBUTTON|BS_OWNERDRAW,
		boxwd-120+(wndwd-boxwd)/2,
		80,
		120,
		30,
		hWnd,
		(HMENU)IDC_REPEAT_BUTTON,
		GetModuleHandle(NULL),
		NULL);
	lpfnOldWndProc1 = (WNDPROC)SetWindowLong(hWndButton1,
                 GWL_WNDPROC, (DWORD) ButProc1);
	
...
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message)
	{
	case WM_CTLCOLORBTN:
			if((HWND)lParam==hWndButton){
				
			
				if(!hov){ 
					hBitmap = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_CLOSE),IMAGE_BITMAP,0,0,LR_COPYFROMRESOURCE);		
				}
				else{
					hBitmap = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_CLOSE_HOVER),IMAGE_BITMAP,0,0,LR_COPYFROMRESOURCE);		
				}
				 hdcMem0=CreateCompatibleDC((HDC)wParam); 
				 SelectBitmap(hdcMem0,hBitmap) ;
				 BitBlt ((HDC)wParam,0,0,20,20,hdcMem0, 0,0, SRCCOPY) ;
		
			}
			if((HWND)lParam==hWndButton1){
				if(!hov1){
				 hBitmap = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_DOWNLOAD),IMAGE_BITMAP,0,0,LR_COPYFROMRESOURCE);
				}
				else{
				 hBitmap = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_DOWNLOAD_HOVER),IMAGE_BITMAP,0,0,LR_COPYFROMRESOURCE);
				}
		
				 hdcMem0=CreateCompatibleDC((HDC)wParam); 
				 SelectBitmap(hdcMem0,hBitmap) ;
				 BitBlt ((HDC)wParam,0,0,120,30,hdcMem0, 0,0, SRCCOPY) ;
	
			}
			...
	}
	
}





LRESULT CALLBACK ButProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	
	switch (message)
	{
		case WM_MOUSEMOVE:
		{
		BOOL trackSuccess = TrackMouse( hWnd );
		}break;
		case WM_MOUSEHOVER:
			hov=true;
			InvalidateRect(hWnd,NULL,TRUE);
			break;
		case WM_MOUSELEAVE:
			hov=false;
			InvalidateRect(hWnd,NULL,TRUE);
			break;
	}
	return CallWindowProc(lpfnOldWndProc, hWnd, message, wParam, lParam);	
}


LRESULT CALLBACK ButProc1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	
	switch (message)
	{
		case WM_MOUSEMOVE:
		{
		BOOL trackSuccess = TrackMouse( hWnd );
		}break;
		case WM_MOUSEHOVER:
			hov1=true;
			InvalidateRect(hWnd,NULL,TRUE);
			break;
		case WM_MOUSELEAVE:
			hov1=false;
			InvalidateRect(hWnd,NULL,TRUE);
			break;
	}
	return CallWindowProc(lpfnOldWndProc, hWnd, message, wParam, lParam);	
}
...
MasterZiv
Дата: 16.04.2015 13:08:39
Картежник,

посмотрю...