Dialog: Probleme mit Farben



  • Ich verwende in meiner Dialoganwendung ein paar Bilder mit nicht-transparentem Hintergrund und möchte daher die Hintergrundfarbe meines Dialogfensters festlegen. Soweit ist das ja auch kein Problem:

    HBRUSH CMouseAppDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
        HBRUSH hbr = CreateSolidBrush(RGB(236, 233, 216));
        pDC->SetBkMode(TRANSPARENT);
    
        return hbr;	
    }
    

    Aber: Ich habe ein read-only(!!!) Edit-Feld, welches ich ebenfalls einfärben möchte, da ich es als Konsole benutze (schwarzer Hintergrund, weiße Schrift). Dies färbe ich so ein:

    BOOL CMouseAppDlg::OnInitDialog()
    {
    	CFont EditFont;
    	LOGFONT lf;                        
    	memset(&lf, 0, sizeof(LOGFONT));   // Speicher reservieren
    	lf.lfHeight = 18;                  // 18 Pixel große Schrift
    	lf.lfWeight  = FW_BOLD; 
    	strcpy(lf.lfFaceName, "Arial");    // Schriftart Arial
    
    	EditFont.CreateFontIndirect(&lf);  
    	ConsoleData_Control.SetBackColor(RGB(0,0,0));
    	ConsoleData_Control.SetTextColor(RGB(255,255,255));
    	ConsoleData_Control.SetFont(&EditFont,0);	
    
            [...]
    }
    

    Nun ist es leider so, dass nur eine der beiden Dinge funktioniert. Wenn ich das Dialogenster färben will, wird die Konsole nicht gefärbt.

    Wie kriege ich beides gleichzeitig hin? Ich hab schon geschaut, wie ich die Farbe der Editbox noch ändern kann, aber alle Varianten die ich gefunden habe, funktionieren nur bei Editboxen, die nicht read-only sind. Ich möchte kein Richt-Text Feld nehmen.

    Hat jemand einen Tipp für mich?



  • Was ist ConsoleData_Control?



  • Oh, das hätte ich vielleicht erwähnen sollen 😉

    ConsoleData_Control ist eine CEdit Control Member Variable für das Konsolen-Edit Feld.



  • na dann mach doch ne eigene CEdit klasse und schmeiß alle ausgaben weg (also read only) und dann kann man über OnCtlColor im der Edit-Klasse das bunt machen wie man will. nur mal so als einfache Idee. nebeneffekte weiss ich net was da noch kommt, da ich das noch net versucht habe.


  • Mod



  • In der MSDN kann ich weder bei CEdit noch bei CWnd etwas von SetTextColor / SetBackColor finde, wo sind die denn her?

    Naja, jedenfalls: OnCtlColorXxxx, wie schon erwähnt.


  • Mod

    Evtl. COleControl!



  • Vielen dank, ich werde mir das alles mal anschauen.



  • Hallo,

    also leider hilft mir das alles nicht weiter 😞

    Ich verstehe den Sinn dieses Reflects nicht. Und wie erstelle ich denn eine neue CEdit Klasse und schmeiße die Ausgaben weg?

    Edit: OK, das mit den Reflects hab ich verstanden udn implementiert - aber es funktioniert nicht. Damit wird mein Edit Feld garnicht mehr gefärbt.


  • Mod

    Verwendest Du denn auch dieses CEdit Control in dem Dialog?



  • Ich habe jetzt die Lösung:

    HBRUSH CMouseAppDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	// Konsolenfarbe soll sich nicht ändern, 
    	// da die Konsole eine andere Farbe als der Rest hat
    	if( pWnd->GetDlgCtrlID() == IDC_E_CONSOLE ) 
    		return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
    	else
    	{     
    		// Hintergrund einfärben, falls jemand andere Windows-Farben verwendet 
    		// (sonst fallen die nicht-transparenten Bildhintergründe auf)
    		HBRUSH hbr = CreateSolidBrush(RGB(236, 233, 216));
    
    		// Texthintergrund transparent machen
    		pDC->SetBkMode(TRANSPARENT);
    
    		return hbr;	
    	}
    }
    

  • Mod

    Schnapphase schrieb:

    Ich habe jetzt die Lösung:

    {     
    		// Hintergrund einfärben, falls jemand andere Windows-Farben verwendet 
    		// (sonst fallen die nicht-transparenten Bildhintergründe auf)
    		HBRUSH hbr = CreateSolidBrush(RGB(236, 233, 216));
    

    Nein hast Du nicht. Du erzeugst GDI-Leaks ohne Ende!


Anmelden zum Antworten