Hintergrundfarbe einer CListBox ändern?



  • Hallo,

    wie kann ich die Hintergrund-Farbe (normaleweise weiß) einr CListBox auf grau setzen, ohne sie zu 'disablen'?

    Danke,

    Sebastian



  • Das machst Du in OnCtlColor Deiner Klasse.

    Lege Dir zusätzlich einen CBrush als Membervariable in der Klasse an.
    Bei mir heißt er listen_farbe.

    Initialisier den Brush mit listen_farbe.CreateSolidBrush(RGB(0,0,0)) im Konstruktor und vergiß nicht ihn zu löschen im Destruktor der Klasse mit listen_farbe.DeleteObject(), sonst Game over irgendwann, weil Dir die offenen GDI-Objekte den Grakaspeicher um die Ohren hauen. Ich bin ein gebranntes Kind, was das betrifft. 🙂

    FIRMA_SELECTED ist eine BOOL, damit OnCtlColor() Bescheid weiß, daß jetzt eine andere Farbe als die Standardfarbe als Hintergrund gilt.

    HBRUSH CForm1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
    
    	switch (nCtlColor) 
    	{ 
    
    	case CTLCOLOR_LISTBOX:
    
    		if(pWnd->GetDlgCtrlID() == IDC_LISTE_FIRMEN && FIRMA_SELECTED)
    
    		{
    
     			pDC->SetBkMode(TRANSPARENT);		// Setzt den Hintergrund, dort wo Text ist transparent, 
    												// so daß elemente_farbe auch hinter den Zeichen ist			
    			hbr = (HBRUSH) listen_farbe;		// Setzt die Farbe für den Hintergrund
    			break;
    
    		}			break;	
    
    		}
    		break;
    
    	}
    
    	return hbr;
    }
    

    Wenn sich Deine Hintergrundfarbe z.B. auf Knopfdruck verändern soll oder wie auch immer, zwingst Du zum Deine Liste mit

    meine_liste.RedrawWindow();
    

    zum Neuzeichnen

    Vorher die oben beschriebene BOOL auf TRUE setzen und schon weiß OnCTlColor() Bescheid, daß der Hintergrund ne andere Farbe bekommt.

    Mit der BOOL ist bestimmt net das eleganteste, aber funzt 100%.

    Beste Grüße

    BOA



  • Hallo,

    vielen Dank für die qualifizierte Hilfe! Ich hab das mal wie folgt ausprobiert, jedoch hat sich an der Farbe meiner CListBox nichts geändert??
    Ich weiß nicht, was ich falsch mache.
    Das Objekt habe ich zu testzwecken gleich "vor Ort" erzeugt und wieder gelöscht.

    Mal was ganz anderes:
    Ich habe sehr lange in Delphi programmiert, und da musste man lediglich im Objectinspector in der Eigenschaft "Color" die gewünschte Farbe einstellen. Nur in VC++ scheint das eine halbe Doktorarbeit zu sein?!?

    HBRUSH CPerlDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    	if (nCtlColor==CTLCOLOR_LISTBOX && pWnd->GetDlgCtrlID()==IDC_REF_LIST)
    	{
    
    		pDC->SetBkMode(TRANSPARENT);        // Setzt den Hintergrund, dort wo Text ist transparent,  
    											// so daß elemente_farbe auch hinter den Zeichen ist             
    		listen_farbe.CreateSolidBrush(RGB(10,40,0));
    		hbr = (HBRUSH) listen_farbe;		// Setzt die Farbe für den Hintergrund
    		listen_farbe.DeleteObject();
    	}
    
        return hbr; 
    }
    

    Leider habe ich auch keine Übersicht gefunden, die mir sagen könnte, wie ich das typische Grau der Steuerelemente definiere (in Delphi wäre das clBtnFace).

    Was muss ich der Variablen "listen_farbe" zuweisen?

    Vielen Dank nochmal für die Hilfe,

    Sebastian



  • Aloha noch einmal,

    die Idee mit dem Aufräumen gleich danach weist Dich prinzipiell als ordentlichen Menschen aus. 🙂

    Hat allerdings den Nachteil, daß Du den Brush, mit dem Du die Hintergrundfarbe setzen willst, gleich wieder killst und somit ihn nicht angezeigt bekommst. 😞

    Erschaffe eine Membervariable namens

    CBrush listen_farbe;
    

    Im Konstruktor von CPerlDlg erschaffst Du folgende Hintergrundfarbe

    listen_farbe.CreateSolidBrush(GetSysColor(COLOR_GRAYTEXT));   // GetSysColor holt diverse Systemfarben
    

    Bitte in der MSDN unter GetSysColor die richtige Variable suchen.

    Nicht im Destruktor Deiner Klasse vergessen :

    listen_farbe.DeleteObject()
    

    Und dann den Pinsel so im OnCtlColor() wie in meinem ersten Posting an hbr übergeben.

    Ein Brush ist nichts anderes als ein Bild, wenn Du es löschst, ist es auch weg, und kann net mehr benutzt werden.

    Beste Grüße

    BOA



  • Vielen Dank nochmal!

    Jetzt hab ichs hinbekommen. Manches ist schon etwas gewöhnungsbedüftig, aber was soll man machen...
    Das war wirklich eine engagierte Hilfe.

    Viele Grüße,

    Sebastian


Anmelden zum Antworten