Backgroundfarbe von Edit-Feld ändern



  • Hi alle, 🙂
    ich möchte zwei Edit-Felder ändern, und zwar die Backgroundfarbe.
    Ich habe so gemacht:
    1. Einen Pinsel deklariert

    CBrush a;
    

    2.Erstellt in OnInitDialog()

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

    3.Nachrichtenbearbeiter WM_CTLCOLOR erstellt
    4.Kod für Nachrichtenbearbeiter geschrieben

    HBRUSH CFdsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
       if (nCtlColor==CTLCOLOR_EDIT){ 
      return  a;
        }
        return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);;
    }
    

    Nun will ich, dass meine Edit-Felder nicht immer und nicht gleichzeitig beide grün sind. Die grüne Farbe muss einen Zustand der im Hintergrund laufenden Anwendung zeigen. Wie kann man in der OnCtlColor() auf bestimmte Edit-Felder zugreifen und Farbe abhängig von irgend-welcher Bedingungen ändern? 😕



  • In dem du die ID des Controls testes.

    HBRUSH CFdsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
       if (pWnd->GetDlgCtrlID() == IDC_DeinEdit && zustand == TRUE){ 
      return  a;
        }
        return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);;
    }
    

    So mal als Beispiel, Wobei IDC_DeinEdit der IDC des gewüscht zu ändenten Edit ist, und zustand der Zustand deiner Hintergrundanwendung, wie du das genau ermittelst muß du selbst wissen, kenn ja deinen Quellcode nicht.

    Gruß Matthias



  • Für solche Sachen ist immer codeing-help.de ganz hilfreich. Da findest du dann alles Rund um die gängigen Steuerelemente.



  • Uruk-h4j schrieb:

    Für solche Sachen ist immer codeing-help.de ganz hilfreich. Da findest du dann alles Rund um die gängigen Steuerelemente.

    Dein Hinweis ganz schön und gut, doch wenn man das so übernimmt, hat man ganz schnell keine Handles mehr, oder was glaubst Du wer die Handles der erstellten Brushs (HBRUSH hBGBrush = CreateSolidBrush(RGB(128, 184, 223));) wieder frei gibt und die OnCtlColor wird sehr oft durchlaufen. Oder lieg ich da falsch?

    Gruß Matthias



  • CTecS schrieb:

    if (pWnd->GetDlgCtrlID() == IDC_DeinEdit && zustand == TRUE){
    

    Das funktioniert gut, mit einem 'aber':
    Der Zustand 'TRUE' wird nicht sofort beim Initialisieren des Dialogs erreicht. Ich sehe schon an einem externen Programm, dass meine Anwendung läuft und der Zustand=TRUE angenommen wird, aber der Edit-Feld ist nicht grün. Erst wenn ich das Fenster minimiere oder anders neu zeichnen lasse, dann ist es grün. Ich glaub, dass es eine Funktion wie Redraw() oder Repaint() oder ähnliche notwendig ist.



  • Wenn der Zustand erreicht wird, kannst du mit Invalidate() entweder auf dem ganzen Dialog oder besser auf das Kontroll ein Neuzeichnen bewirken. Außerdem war das mit dem TRUE/FALSE nut ein Beispiel, wie Du das jetzt genau umsetzt is ja deine Angelegenheit und vom Ablauf deines Programmes abhängig.

    Gruß Matthias



  • Wie kann man das Neuzeichnen nur eines Kontrolls bewirken?


  • Mod

    CWnd::Invalidate



  • Ok, alles klar! 👍
    Für das Edit-Feld eine Variable vom Typ 'control' erstellen und dann variable.Invalidate() aufrufen.



  • Wer lesen kann hats leichter im leben! Hättest Du meinen Beitrag gelesen hätte sich deine letzte Frage über das Neuzeichnen erledigt.

    Gruß Matthias


Log in to reply