CEdit Hintergrundfarbe ändern...

Rudi100

Gesperrt
Hallo alle zusammen,

ich möchte dir Hintergrundfarbe eines EditFeldes ändern. Finde aber nicht den nötigen Befehl dafür! Geht das überhaupt? Habe eine CEdit Variable als auch eine CString.

Über Tips und Tricks jeder Art wäre ich sehr dankbar.

Gruß Rudi
 
Das geht über die WM_CTLCOLOR-Message. Mit dem Klassenassistenten kannst du dafür den Message-Handler "OnCtlColor()" erstellen.
Infos und Beispielcode gibt's in der MSDN zur Beschreibung von "OnCtlColor".
 
Vielen Dank.....

Da die MSDN auf englisch ist und meine Kenntnisse dafür nicht ausreichen wäre das, dass selbe wie wenn ich es auf Russisch oder Chinesisch lesen könnte.

Genau aus DIESEM Grund habe ich diese Frage hier gestellt. Genau dafür sind diese Forum da. User helfen Usern....

Kann mir das vielleicht jemand genauer erläutern?

Vielen Dank...
 
Oh, ich wusste nicht, dass du mit der MSDN auf (sprachlichen) Kriegsfuss steht.
Als Tipp war's doch aber gar nicht schlecht :) .

Ich habe dir mal die Schritte aufgeschrieben:

1. In der Klassendeklaration des Dialogs (.h-Datei) eine CBrush Varaiable anlegen:
CBrush m_brush

2. Im Konstruktor des Dialogs (.cpp-Datei) den Brush erzeugen (im Beispiel rot):
m_brush.CreateSolidBrush(RGB(255,0,0))

3. Mit dem Klassenassistenten einen Handler für WM_CTLCOLOR anlegen (OnCtlColor)

4. Die Methode OnCtlColor ergänzen:

Code:
HBRUSH ...::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    switch( pWnd->GetDlgCtrlID() )
    {
        case IDC_EDIT_XXXX: // ID des Editfeldes
            pDC->SetBkColor(RGB(255,0,0));
            return (HBRUSH)m_brush.GetSafeHandle();
            
        // Bei Bedarf weitere Zweige     
    }

    return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}
 
Vielen Dank bis dahin klappt soweit alles...

Jetzt habe ich aber folgendes Problem:

Ich will das Edit Feld nicht immer Rot haben sondern nur zu einem bestimmten Zeitpunkt. Also ich muß das irgendwie steuern. Desweiteren habe ich mehr als ein Editfeld welches gegebenfalls Rot werden muß.

Zusammengefasst:
- mehrer Editfelder unabhängig voneinander Rot färben...
 
Zuletzt bearbeitet:
Dann brauchst du für jedes Edit-Feld ein eigenes CBrush-Objekt bzw. du legt ein Array an. Sinnvollerweise solltest du dann auch für die Farbwerte selbst entsprechende Variablen anlegen (Typ: COLORREF).
Für jedes Edit-Feld kannst du dann einen eigenen Zweig in der case-Struktur bei OnCtlColor() vorsehen.

Umfärben und Aktualisieren sieht so aus

Code:
// Farben ändern und Ansicht aktualisieren 
m_crColor = RGB(0,0,255); // diesmal blau
m_brush.DeleteObject();
m_brush.CreateSolidBrush(m_crColor);

Invalidate(); // Ansicht aktualisieren
Code:
// in OnCtlColor mit Variable arbeiten
case IDC_EDIT_ ... :
    pDC->SetBkColor(m_crColor);
    return (HBRUSH)m_brush.GetSafeHandle();
 
Habe noch was entscheidendes Vergessen....Sorry mir ist eben aufgefallen beim testen.

Das EditFeld welches Gefärbt werden soll ist nicht das Editfeld welches geändert wird. Also ein anderes. Beim testen ist mir aufgefallen das dass Editfeld erst dann seine Farbe ändert wenn ich es anklicke also wenn es den Focus bekommt.

Gibt es eine Möglichkeit den gesammten Dialog zu aktualisieren? Also so das dass Editfeld seine Farbe ändert.
 
1. Frage:
Richtig, wenn du die Edit-Felder unabhängig voneinander steuern willst, brauchst du für jedes Edit-Feld eine eigene COLORREF-Variable zur Speichern der Farbinformation.

2. Frage:
Aktualisieren des gesamten Dialoges mit
Invalidate();

Spezielles Edit-Feld mit
GetDlgItem(IDC_EDIT_XXX)->Invalidate();
 
Vielen vielen Dank. Also soweit klappt das schon.

Wo kann man den nachlesen welche Farbe welche Wertzusammensetzung hat
(255,0,0 --> Rot)

Gibt es eine Tabelle oder so? Wo?

Nochmals vielen Dank.
Gruß Rudi
 

Neue Beiträge

Zurück