Wie kann man die Farbe von Steuerelementen verädern



  • Hallo,

    ich möchte die Hintergrundfarbe von Steuerelementen verändern. Ich weiss aber nicht wie ich das "flächendeckend" ausführen soll. Ich habe in OnCtlColor über den Pointer pDC die Backgroundcolor geändert. Dabei wird leider nur die Hintergrundfarbe des Textes geändert, der im Steuerelement steht. Ist das Steuerelement größer definiert, als der Text der darin steht, bleibt in dem nichtbeschrieben Teil die alte graue Farbe erhalten.

    Wie kann ich das ändern?



  • Aloha,

    mach mal so...

    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    switch (nCtlColor) 
    { 
    
    case CTLCOLOR_STATIC:
    	{
    
     	pDC->SetBkMode(TRANSPARENT);		
    		hbr = (HBRUSH) elemente_farbe;
    	         break;
    
    	}
    
    }
    
    return hbr;
    

    element_farbe ist ein CBrush, den Du als Member für die Klasse im Konstruktor oder sonstwo definierst.

    Und alles wird gut...

    Grüße

    BOA



  • Das klappt irgendwie nicht.



  • Hast du das in die richtige Nachrichtenbehandlungsfunktion geschrieben? (OnCtlColor) 🙂



  • Mr_Groove schrieb:

    Das klappt irgendwie nicht.

    Aloha,

    Der o.g. Quelltext funzt natürlich nur bei STATIC-Steuerelementen.
    Definier doch mal, was für Steuerelemente eingefärbt werden sollen, vielleicht haben wir hier ein Mistverständnis...

    Grüße

    BOA



  • Ich hab vornehmlich mal Static Text Steuerelemente. Die anderen (Edit-Text und Buttons) werd ich schon irgendwie hinbekommen.

    Aber das mit den Static funktioniert nicht hab das so gemacht

    [cpp]

    HBRUSH CZahlDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO: Attribute des Gerätekontexts hier ändern

    if(nCtlColor==CTLCOLOR_STATIC || nCtlColor==CTLCOLOR_MSGBOX)
    {
    pDC->SetBkMode(TRANSPARENT);
    elemente_farbe.CreateSolidBrush(RGB(91,41,41));
    hbr = (HBRUSH) elemente_farbe;

    }

    // TODO: Anderen Pinsel zurückgeben, falls Standard nicht verwendet werden soll
    return hbr;
    }



  • Aloha,

    laß mich raten, Dein Proggi schmiert jetzt sogar ab ?
    Er geht jetzt mehr als einmal in OnCTlColor und will für jedes Static - Element den Brush anlegen, es geht aber nur einmal, es sei denn Du löschst den Brush zwischendurch.

    Dein

    elemente_farbe.CreateSolidBrush(RGB(91,41,41));
    

    packste mal in den Konstruktor Deines Dialoges.
    In den Destruktor schreibste folgendes :

    elemente_farbe.DeleteObject();
    

    Ganz wichtig ansonsten haste Probs mit Deinem Speicher von Deiner Graka später.

    Grüße

    BOA



  • Versuch mal dieses:
    Als IDC_DIALOGDINGS musst du natürlich deine Steuerelemente ID angeben.
    ...nicht vergessen in der Messagemap WM_CTLCOLOR eintragen !

    HBRUSH CDeinDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    	switch(pWnd->GetDlgCtrlID())
    	{
    	case IDC_DIALOGDINGS:
    							pDC->SetTextColor(RGB(255,0,0));
    							break;
    	}	
    	return hbr;
    }
    

Anmelden zum Antworten