Transparentes Static auf Tab Control



  • Hallo,
    wenn man ein Static ( ganz normal mit Text ) transparent machen möchte, kann man ja beim Parentfenster die WM_CTLCOLORSTATIC Nachricht verarbeiten.
    Was ist aber, wenn das Static ein Child eines Tab Controls ist ( das standardmäßig einen weissen Hintergrund hat )? Dann ist immer ein grauer Rahmen um das Static herum zu sehen. Ich habe schon versucht, dem Tab Control eine WndProc zu geben, aber dann wird es garnicht mehr angezeigt. oO

    Wisst ihr einen Rat?


  • Mod

    Warm willst Du das Static Transparent machen? Man gibt ihm normalerweise in WM_CTLCOLORSTATIC einfach den Hintergrund den man braucht.



  • Ob transparent oder Hintergrundfarbe ist ja letztendlich egal.
    Nur weiß ich eben nicht, wie ich WM_CTLCOLORSTATIC bei einem Tab Control anwenden soll.
    Wenn ich ihm eine WndProc gebe, sieht man wie gesagt gar nichts mehr.


  • Mod

    Dann zeig doch mal bitte was Du machst!



  • Das ist der relevante Codeausschnitt. Wenn ich die WndProc setze, wird nichts mehr angezeigt.

    LRESULT CALLBACK TabberProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
    {
    	switch( msg )
    	{
    		case WM_CTLCOLORSTATIC:
    			SetBkMode( ( HDC )wparam, TRANSPARENT );
    			return ( LRESULT )GetStockObject( HOLLOW_BRUSH );
    	}
    
    	return DefWindowProc( hwnd, msg, wparam, lparam );
    }
    
    // ...
    
    // Tab Control erstellen
    
    // ...
    
    SetWindowLong( tabcontrol, GWL_WNDPROC, ( LONG )TabberProc );
    

  • Mod

    winni api schrieb:

    Das ist der relevante Codeausschnitt. Wenn ich die WndProc setze, wird nichts mehr angezeigt.

    LRESULT CALLBACK TabberProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
    {
    	switch( msg )
    	{
    		case WM_CTLCOLORSTATIC:
    			SetBkMode( ( HDC )wparam, TRANSPARENT );
    			return ( LRESULT )GetStockObject( HOLLOW_BRUSH );
    	}
    
    	return DefWindowProc( hwnd, msg, wparam, lparam );
    }
    
    // ...
    
    // Tab Control erstellen
    
    // ...
    
    SetWindowLong( tabcontrol, GWL_WNDPROC, ( LONG )TabberProc );
    

    Das wundert mich gar nicht.
    Du spingst ja auchnicht die alte Fensterprozedur an. Was Du hier machst ist kein korrektes Subclassing! Du musst die alte Fensterprozedur sichern und mit CallWindowProc auch in Deiner Fensterprozedur anspringen...

    http://msdn2.microsoft.com/en-us/library/ms633571.aspx



  • Ah, vielen Dank!
    Ich dachte DefWindowProc sucht sich automatisch die richtige Funktion für den Fenstertyp aus. Aber mit Subclassing ist der Aufwand ja auch minimal.


  • Mod

    winni api schrieb:

    Ich dachte DefWindowProc sucht sich automatisch die richtige Funktion für den Fenstertyp aus. Aber mit Subclassing ist der Aufwand ja auch minimal.

    Nein DefWindowProc macht das "Allgemeingültige" aber nicht das spezielle, dafür ist eben die Fensterprozedur da und die hast Du ausgeklammert. So war eben auch keiner da, der etwas gezeichnet hat...



  • Jetzt tut sich schon das nächste Problem auf. Ich hab einen Screenshot davon gemacht: http://img57.imageshack.us/img57/7842/groupboxxg6.png

    Die Objekte, die Childs vom Fenster und Tab Control sind, werden richtig dargestellt. Auch die Statics bei der Group Box. Nur der Button hat einen schwarzen Rand, obwohl die Funktion genau das selbe macht, wie bei dem anderen Button.

    Gibt es auch dafür eine Lösung?


Anmelden zum Antworten