EDIT: Dialog Hintergrund verschwindet



  • Da ich nicht schon wieder einen neuen Thread aufmachen wollte, poste ich hier mal mein aktuelles Problem dazu. Aus meiner Anwendung heraus wird unter anderem eine zweite Anwendung mit CreateProcess gestartet. Diese wird dann erstmal im Vordergrund angezeigt. Wenn ich jetzt diese zweite Anwendung minimiere, erscheint ja wieder mein (unten beschriebener) Dialog auf dem Desktop. Allerdings wird der Hintergrund nicht neu gezeichnet, sondern es erscheint dort der Hintergrund, den meine zweite Anwendung vorher hatte 😕 Gibt es eine Nachricht, die abfängt, dass ich die zweite Anwendung minimiert habe und mein Dialog deswegen wieder im Vordergrund ist? Und hat er dann den Fokus, wenn ich nur die zweite Anwendung minimiere?
    Ich hoffe, mir kann jemand helfen. Vielen Dank schonmal!

    Hallo zusammen!
    Ich hab mal wieder ein (hoffentlich) kleines Problem.
    Erstmal der Ist-Zustand meines Programms: Ich habe einen nicht-rechteckigen Dialog mit mehreren Buttons und zwei CStatic-Objekten, der an einer bestimmten Stelle vergrößert bzw. verkleinert werden kann. Das ganze hat am Anfang sehr geflackert, deswegen habe ich für den Dialog noch das Flag WS_CLIPCHILDREN gesetzt. Seitdem funktioniert alles flackerfrei.
    Jetzt das Problem: Seitdem das Flag WS_CLIPCHILDREN gesetzt ist, wird der Hintergrund der beiden CStatic-Objekte nicht mehr gezeichnet (er soll die gleiche Farbe haben wie der Dialoghintergrund). Ich habe es schon mit der Funktion

    HBRUSH CStartdialog3Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    

    versucht, leider bringt das nciht den gewünschten Erfolg. Das Flag bewirkt ja gerade, dass die Steuerelemente ausgespart werden beim neu zeichnen. Wie bekomme ich den Dialog jetzt dazu, meine beiden CStatics auch immer neu zu zeichnen und den Hintergrund zu füllen?



  • Ich nochmal 😃

    Für alle, die es interessiert: Problem gerade gelöst! Ich habe mir eine eigene Klasse für die beiden Statics angelegt und dort folgendes geändert:
    1.) OnEraseBkgnd überschrieben und FALSE zurückgegeben

    BOOL CStaticCtrl::OnEraseBkgnd(CDC* pDC) 
    {
    	return FALSE;	
    }
    

    2.) OnPaint überschrieben und dort den Hintergrund gefüllt und das Icon eingefügt, welches angezeigt werden soll

    void CStaticCtrl::OnPaint() 
    {
    	CPaintDC dc(this); // device context for painting
    
    	// Brush für die Hintergrundfarbe erstellen
    	CBrush* brush = new CBrush(RGB(148,147,170));
    
    	// Rect holen
    	CRect rect;
    	GetClientRect(&rect);
    
    	// Icon laden
    	HICON icon = AfxGetApp()->LoadIcon(IDI_ICON1);
    
    	// Region mit Hintergrundfarbe füllen
    	dc.FillRect(rect, brush);
    
    	// Icon zeichnen
    	dc.DrawIcon(0,0,icon);
    


  • Hat keiner eine Idee?

    Mensch so ein Mist. Das Programm läuft wunderbar - nur diese doofe Hintergrund zeichnet sich in....ich sag mal 50 % der Fälle....nicht neu 😞


  • Mod

    Wenn Du WS_CLIPCHILDREN verwendest dann muss ein CStatic auch den Hintergrund zeichnen! OnEraseBkGnd zu verwenden ist falsch!
    CStartdialog3Dlg::OnCtlColor macht gar nichts außer das Parent nach dem Hintergund zu fragen.

    Windows macht auc nicht andres als im OnEraseBkGnd einen WM_CTLCOLORSTATIC an das Parent zu senden um den Hintergrund zu ermitteln.



  • Also verstehe ich das jetzt richtig so, dass ich dann einfach ein Static-Control quasi hinter alle anderen Buttons lege als Hintergrund?


  • Mod

    Jetzt verstehe ich nichts mehr. Warum solltest Du das wollen? Um den Hintergrund selberzu manipulieren musst Du den Dialog verändern.

    http://www.microsoft.com/msj/0597/c0597.aspx



  • Also das Problem ist, dass sich mein Dialoghintergrund, aus welchem Grund auch immer, nicht neu zeichnet, wenn ich mit einem anderen fenster genau drüber bin und dieses dann minimiere. Meine beiden CStatic-Controls, die im Dialog vorhanden sind, zeichnen sich immer schön brav neu. Und da hab ich mir gedacht, dass das ganze ja zumindest dann optisch funktionieren müsste (auch wenn es sicherlich nicht die beste Lösung ist), wenn ich hinter alle meine Buttons einafch ein CStatic lege mit der Hintergrundfarbe, die der Dialog haben soll. So sieht es zumindest vernünftig aus, auch wenn (für den Benutzer unsichtbar) die Hintergrundfarbe des eigentlichen Dialogs natürlich trotzdem nicht neu gezeichnet wird...



  • Huch....ich glaube ich hab das Problem gerade gelöst. Und ich dachte, ich hätte dass chon ausprobiert 😕

    Ich gebe jetzt in OnEraseBkgnd() einfach FALSE zurück und zeichne meinen Hintergrund in der OnPaint-Methode komplett selbst. Das scheint zu funktionieren.... Jetzt bin ich total verwirrt - hab ich das wirklich noch nicht ausprobiert 😮


Anmelden zum Antworten