Steuerelement



  • Ideologisch motiviertes Bastelwerk.



  • Warum nimmst Du nicht die MFC? (oder sonstige Wrapper um die WinAPI?)



  • Ideologisch motiviertes Bastelwerk.

    *lol*



  • Ich habe noch ein kleines Problem... mir will einfach keine Lösung einfallsen...
    Wie kann ich prüfen, ob der Cursor über dem Control ist, damit das Control seine Farbe änder?

    LRESULT CALLBACK CtrlProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	static RECT rect = {0, 0, 0, 0};
    	static PAINTSTRUCT ps;
    	static  HDC hDC;
    	HBRUSH hBr = CreateSolidBrush(RGB(255, 155, 0));;
    
    	switch(uMsg)
    	{
    	case WM_CREATE:
    		hDC = GetDC(hWnd);
    		GetClientRect(hWnd, &rect);
    		return 0;
    
    	case WM_PAINT:
    		{
    			SelectObject(hDC, hBr);
    			RoundRect(hDC, rect.left, rect.top, rect.right, rect.bottom, 10, 10);
    			ValidateRect(hWnd, NULL);
    			return 0;
    		}
    
    	case WM_SIZE:
    		rect.right	= LOWORD (lParam);
    		rect.bottom = HIWORD (lParam);
    		return 0;
    
    	case WM_DESTROY:
    		ReleaseDC(hWnd, hDC);
    		return 0;
    
    	default:
    		break;
    	}
    
    	return(DefWindowProc(hWnd, uMsg, wParam, lParam));
    }
    


  • MOUSE OVER EVENT



  • WM_MOUSEMOVE



  • ???

    nee, mit WM_MOUSEMOVE bin ich da nicht viel weiter gekommen.



  • Was ging nicht? Du brauchst natürlich auch noch TrackMouseEvent...

    Aber schau doch einfach in die MFC... da ist schon alles gemacht und da kannst Du Dir es ganz simpel abschauen!



  • in welchen MFC header soll ich gucken?



  • Ich dachte Du hast VS6 oder später... sorry...
    Macht aber auch nix: Dann schau einfach in der WTL:
    http://sourceforge.net/projects/wtl/

    Oder in sonstigen Win32-API Wrappern:
    http://smartwin.sourceforge.net/



  • LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch(uMsg)
    	{
    	case WM_CREATE:
    		return 0;
    
    	case WM_DESTROY:
     		PostQuitMessage(0);
    		return 0;
    
    	default:
    		break;
    	}
    
    	return(DefWindowProc(hWnd, uMsg, wParam, lParam));
    }
    
    LRESULT CALLBACK CtrlProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	static RECT rect = {0, 0, 0, 0};
    	static PAINTSTRUCT ps;
    	static  HDC hDC;
    	HBRUSH hBr = CreateSolidBrush(RGB(255, 155, 0));
    
    	switch(uMsg)
    	{
    	case WM_CREATE:
    		GetClientRect(hWnd, &rect);
    		hDC = GetDC(hWnd);
    
    		TRACKMOUSEEVENT track;
    		track.cbSize		= sizeof(track);
    		track.hwndTrack		= hWnd;
    		track.dwFlags		= TME_HOVER | TME_LEAVE;
    		track.dwHoverTime	= 500;
    
    		_TrackMouseEvent(&track);
    
    		return 0;
    
    	case WM_PAINT:
    		{
    			SelectObject(hDC, hBr);
    			RoundRect(hDC, rect.left, rect.top, rect.right, rect.bottom, 10, 10);
    			ValidateRect(hWnd, NULL);
    			return 0;
    		}
    
    	case WM_MOUSEHOVER: 
    		hBr = CreateSolidBrush(RGB(0, 55, 200));
                    InvalidateRect(hWnd, NULL, TRUE);
    		return 0;
    
    	case WM_MOUSELEAVE: 
    		hBr = CreateSolidBrush(RGB(255, 155, 0));
                    InvalidateRect(hWnd, NULL, TRUE);
    		return 0;
    
    	case WM_SIZE:
    		rect.right	= LOWORD (lParam);
    		rect.bottom = HIWORD (lParam);
    		return 0;
    
    	case WM_DESTROY:
    		ReleaseDC(hWnd, hDC);
    		return 0;
    
    	default:
    		break;
    	}
    
    	return(DefWindowProc(hWnd, uMsg, wParam, lParam));
    }
    

    Funktioniert aber leider nicht...



  • Hat keiner eine Idee, woran es liegt?



  • hBr ist nicht static der wird doch jedes mal wieder mit CreateSolidBrush(RGB(255, 155, 0)) belegt. hBr sollte ausserdem dann echt ans hWnd geknüpft sein wenn es static ist hast du ein prob wenn du mehr als 1 steuerelement machst 😮

    ausserdem solltest du den brush auch wieder mit DeleteObject zerstören



  • gemacht... aber funktioniert trotzdem nicht...

    LRESULT CALLBACK CtrlProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	static RECT rect = {0, 0, 0, 0};
    	static PAINTSTRUCT ps;
    	static  HDC hDC;
    	static HBRUSH hBr = CreateSolidBrush(RGB(255, 155, 0));
    
    	switch(uMsg)
    	{
    	case WM_CREATE:
    		GetClientRect(hWnd, &rect);
    		hDC = GetDC(hWnd);
    
    		TRACKMOUSEEVENT track;
    		track.cbSize		= sizeof(track);
    		track.hwndTrack		= hWnd;
    		track.dwFlags		= TME_HOVER | TME_LEAVE;
    		track.dwHoverTime	= 50;
    
    		_TrackMouseEvent(&track);
    
    		return 0;
    
    	case WM_PAINT:
    		{
    			SelectObject(hDC, hBr);
    			RoundRect(hDC, rect.left, rect.top, rect.right, rect.bottom, 10, 10);
    			DeleteObject(hBr);
    			ValidateRect(hWnd, NULL);
    			return 0;
    		}
    
    	case WM_MOUSEHOVER: 
    		{
    			hBr = CreateSolidBrush(RGB(0, 55, 200));
    			InvalidateRect(hWnd, NULL, TRUE);
    			return 0;
    		}
    
    	case WM_MOUSELEAVE:
    		{
    			hBr = CreateSolidBrush(RGB(255, 155, 0));
    			InvalidateRect(hWnd, NULL, TRUE);
    			return 0;
    		}
    
    	case WM_SIZE:
    		rect.right	= LOWORD (lParam);
    		rect.bottom = HIWORD (lParam);
    		return 0;
    
    	case WM_DESTROY:
    		ReleaseDC(hWnd, hDC);
    		return 0;
    
    	default:
    		break;
    	}
    
    	return(DefWindowProc(hWnd, uMsg, wParam, lParam));
    }
    

Anmelden zum Antworten