Hintergrundfarbe im Dialog



  • Ich versteh die Welt nicht mehr.
    Was ist daran Falsch.
    Ich möchte die Hintergrundfarbe des Dialogfeldes änder (Klappt auch).
    Edit-Felder bzw. ComboBoxen sollen eine andere Farbe bekommen.
    Deshalb habe ich in OnInitDialog()

    m_Brush.CreateSolidBrush(RGB(0,255,0));
    

    und in OnCtlColor();

    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    pDC->SetBkMode(TRANSPARENT);
    switch (pWnd->GetDlgCtrlID())   
        {  
         case IDC_USERL: // ComboBox control ID funktioniert (ist rot)     
            pDC->SetBkColor(RGB(255,0,0)); 
            pDC->SetTextColor(RGB(0,0,0)); 
            hbr = m_Brush; 
            break;
    	case IDC_CHATMSG: // CEdit control ID funktioniert nicht (ist grün)
    
            pDC->SetBkColor(RGB(255,0,0)); 
            pDC->SetTextColor(RGB(0,0,0)); 
            hbr = m_Brush; 
            break;
    	case IDD_GAMIGOTV_DIALOG: // CDialog control ID 
    
            pDC->SetBkColor(RGB(0,255,0)); // Hat keine Auswirkung, egal was ich reinschreibe, bleibt auch bei RGB(0,0,0) grün
            pDC->SetTextColor(RGB(0,0,0)); 
            hbr = m_Brush; 
            break;
    
        default:     
            hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor); 
            break;   
        } 
    	return m_Brush;
    

    Habe auch schon versucht hbr statt m_Brush zurückzugeben.
    Dann werden zwar die Editfelder Rot aber das Dialogfeld bekommt gar keine Farbe bzw. nur die Standard-Systemfarbe.



  • http://www.c-plusplus.net/forum/viewtopic.php?t=39067

    schau mal darein, der letzte Eintrag hat bei mir funktioniert, soweit ich mich erinnere.



  • Aloha,

    mein OnCtlColor...

    HBRUSH CForm1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
        HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
    
        switch (nCtlColor) 
        { 
    
        case CTLCOLOR_STATIC:
    
            if(pWnd->GetDlgCtrlID() == IDC_UPDATE || pWnd->GetDlgCtrlID() == IDC_CHECKMAIL){
    
                pDC->SetBkMode(TRANSPARENT);        // Setzt den Hintergrund, dort wo Text ist transparent, 
                                                    // so daß elemente_farbe auch hinter den Zeichen ist
                hbr = (HBRUSH)white_brush;            // Setzt die Farbe für den Hintergrund
    
                break;            
    
            }
    
            break;
    
        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;
    
            }else if(pWnd->GetDlgCtrlID() == IDC_DEVICE_TYPE_LISTE && GTYP_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;
    
        }
    
        return hbr;
    }
    

    Ich habe zwei Membervariablen vom Type CBrush namens elemente_farbe & listen_farbe.
    Diese initialisierst Du wo Du willst ( Beispiel im Konstruktor ).
    Diese müssen dann im Destruktor gekillt werden gleichzeitig.

    Die Edits heißen übrigens CTLCOLOR_EDIT.

    Und alles wird gut.... 😉

    Ach so, den Dialog Hintergrund laß ich im

    void CForm1::OnPaint() 
    {
    	CPaintDC dc(this);
    
    	CRect rect; 
    	GetClientRect(&rect); 
    	dc.FillSolidRect(&rect,WHITE); 
    
    	CFormView::OnPaint();
    }
    

    machen.

    Grüße

    BOA



  • @BOA

    danke, das klappt sehr gut. 😃
    Aber ist dir schon mal aufgefallen, das wenn eine Combobox auf Dropdown-Listenfeld steht, immer der erste Eintrag Weiß ist?
    Hast Du ne Lösung für das Problem?



  • Aloha,

    das habe ich gerade vor kurzen hier irgendwo gelesen, daß darüber philosophiert wurde.
    Hab es aber nicht mehr verfolgt. Warst Du nicht daran sogar beteiligt ?

    Aber ist mir so noch nicht aufgefallen.
    Klingt aber verdammt nach Subclassen, und dann per Hand, weil die Combobox ja aus Liste und Editfeld besteht ?!?! (<-- nur ne Vermutung, das mit dem Subclassen. )

    Grüße

    BOA



  • Ne, hab mich nicht daran beteiligt. Habe das selbst erst vor zwei Tagen festgestellt. (oder wars gestern?) Egal.
    Ich hab mal mit Rapha darüber gesprochen, allerdings nur über ICQ.

    Mal was anderes. Weißt du wie ich meinen Code ändern muss, damit ich nicht die Standard-farbe zurückbekomme, wenn meine ComboBox deaktiviert ist.
    Ich hab jetzt ein graues Dialogfeld und eine deaktivierte Combobox hat die Systemfarbe. Wenn Sie aktiviert wird ist sie weg (also die Farbe, nicht die Box) 😃
    Ach ja und die Ränder von den GroupBoxen sind auch noch in der Systemfarbe 😞
    und das obwohl ich

    default:
    pDC->SetBkMode(TRANSPARENT);
    hbr = (HBRUSH) listen_farbe;
    break;
    

    gemacht habe.



  • Aloha,

    das sind ja gleich drei Wünsche auf einmal. 😉

    Bei den Gruppenfeldern such ich auch ne Lösung ohne Subclassen zu müssen.
    Nee, leider keine Ahnung.

    So ein richtiger Hackerscheiß wäre es, wenn Du bei Bedarf die Systemfarben änderst. 🙂
    Da freut sich der Anwender....

    Ansonsten bleibt glaube ich nur Deine eigene Sub-Klasse schreiben für Listboxen und selber ausmalen. ( auch nur ne Mutmaßung, bei Buttons funzt es jedenfalls, da hab ich mir ne Klasse bei Codeguru geklaut, wo ich bei Buttons mir meine eigene Farben setzen kann) 😞 ).

    Grüße

    BOA



  • Hi!
    Zum BOAs mein OnCtlColor hätte ich diese kleine Ergänzung:

    HBRUSH CAuswahlDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    	if(CTLCOLOR_DLG)
    		return HBRUSH(*m_HinterGrundBrush);
    	return hbr;
    }
    

    Damit wäre das OnPaint() nicht nötig. 😃

    Gruß A.K.


Anmelden zum Antworten