Subclassing einer GroupBox



  • Hallo zusammen, ich habe mich zur Zeit an einem Problem festgebissen bei dem es darum geht, eine Subclass einer GroupBox zu erstellen.
    Es funktioniert auch teilweise, d.h. die Buttons, die auf der GroupBox verankert sind senden ihre WM_COMMAND Messages an die Haup-Window-Prozedur.
    Doch nun zu meinem Problem. Ich habe festgestellt dass, wenn ich das Fenster nehme und es aus dem Bild schiebe, es anschließend wieder hinein ziehe, dann wird die GroupBox nichtmehr neu gezeichnet.
    Darum die Frage: Wie kann ich die Neuzeichnung der GroupBox erreichen?
    Ich habe auch schon einmal die Subclass entfernt (auskommentiert), dann geschieht dies nicht. Also muss es wohl in irgend einer Art und Weise daran liegen, doch ich weiß nicht wo.

    Hier nun die Codeausschnitte:

    //Steht vor der Nachrichtenschleife in der WinMain-Funktion
    //Ich weiss, sollte man eher in WM_CREATE oder so packen, ist ja nur
    //fuer Testzwecke gedacht :P
    SetWindowLongPtr( hGroupBoxActions, GWLP_WNDPROC, reinterpret_cast<LRESULT>(GroupBoxProc) );
    
    //GroupBox Prozedur
    LRESULT CALLBACK GroupBoxProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
    	switch( msg )
    	{
    		case WM_COMMAND:
    			return SendMessage( GetParent(hWnd), msg, wParam, lParam );
    			break;
    	}
    	return CallWindowProc( WndProc, hWnd, msg, wParam, lParam );
    }
    
    //Haup-Window Prozedur
    LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
    	switch( msg )
    	{
    		case WM_QUIT:
    			DestroyWindow( hWnd );
    			return 0;
    			break;
    
    		case WM_DESTROY:
    			PostQuitMessage(0);
    			return 0;
    			break;
    
                 //Die drei Buttons, die sich auf der GroupBox befinden
                 case WM_COMMAND:
    			switch( wParam )
    			{
    				case ID_BUTTON_NEW:
    					MessageBox( NULL, "New", "New", MB_OK );
    					break;
    
    				case ID_BUTTON_DELETE:
    					MessageBox( NULL, "Delete", "Delete", MB_OK );
    					break;
    
    				case ID_BUTTON_SAVE:
    					MessageBox( NULL, "Save", "Save", MB_OK );
    					break;
    			}
    			return 0;
    			break;
    
            default: 
    			return DefWindowProc( hWnd, msg, wParam, lParam );
        }
    }
    

    Ich tippe ja auf einen dämlichen Anfängerfehler, bin aber trotzdem wie immer über jede Hilfe glücklich.

    Danke im Voraus.

    Gruß Honky



  • SetWindowLongPtr gibt Dir die Adresse der Original-Fensterprozedur Deiner Groupbox zurück. Diese Prozedur solltest Du aufrufen für Messages, die Du nicht selbst behandelst. Du rufst stattdessen die Prozedur Deines Hauptfensters auf.


Anmelden zum Antworten