Hintergrundfarbe einer ComboBox ändern



  • Zeichnen würde ich da nichts. Meiner Meinung nach hast du mindestens 2 Möglichkeiten, das wie von Windows vorgesehen zu bewerkstelligen:

    1. Subclassing der Controls. Also WS_BORDER hinzufügen und WM_NCPAINT bearbeiten und den Rahmen selber zeichnen, allerdings könnte die Strichstärke nicht ausreichend sein, sodass auch noch WM_NCCALCSIZE und WM_NCHITTEST selber bearbeitet werden müssen.
    2. Die mMn wesentlich einfachere Methode: Beim Zeichnen des Dialogs das Control mit dem Fokus bestimmen und einen Rahmen um dieses Control zeichnen. Wenn der Fokus wechselt, ein Neuzeichnen veranlassen. Wenn du das zuletzt gewählte Element bzw. die Position speicherst, reichen auch bis zu zwei Rahmen: Einmal in der Hintergrundfarbe des Dialogs um das zuletzt gezeichnete Element und dann in der gewünschten Farbe um das aktuelle.


  • @yahendrik

    Also Zeichnen mithilfe von DrawRect()? Das habe ich grade versucht, allerdings kennt er die Funktion nicht, obwohl ich den Header afxdrawmanager.h includiert habe.



  • FrameRect (bzw. hier). Für einen Rahmen mit einer Strichstärke von mehr als einer logischen Einheit kannst du auch eine Funktion schreiben, die vier Rechtecke zeichnet.



  • @yahendrik

    Aber das habe ich ja schon in meiner Funktion stehen, aber die ComboBoxen werden da nicht eingefärbt.



  • Ja, aber OnCtlColor wird aufgerufen, bevor das Control gezeichnet wird. Alles was du zeichnest, wird wohl übermalt. Die zweite Möglichkeit, die ich kurz beschrieben habe, bezieht sich auf die Paint-Methode des Dialogs. Edit: Und hier muss natürlich das Rechteck entsprechend vergrößert werden, sodass genau außen herum gezeichnet wird.



  • @yahendrik

    Woran liegt es denn, dass der Bereich überschrieben wird? Die OnCtlColor Message wird ja gesendet, sobald ich zb die Edit Box 1 anklicke, und dann wird der Rahmen gezeichnet, der das Febster überdeckt, und erst wenn ich die Maus bewege, wird onCtlColor nochmal aktiviert, und der Text wird wieder sichtbar?



  • Mal eine ganz "blöde" Frage:

    Wenn ich den Focus auf ein Edit Control setze, färbt sich dessen Rahmen per Default blau. Kann man da nicht irgendwo eingreifen und das Ändern? Irgendwo muss ja festgelegt sein, dass es die Farbe blau sein soll.



  • Ich vermute mal dass das Blau die System-Farbe COLOR_HIGHLIGHT ist. Die einzige Möglichkeit diese Farbe zu ändern die ich gefunden habe ist SetSysColors:

    static const int count = 1;
    INT elements[count] = {COLOR_HIGHLIGHT};
    COLORREF colors[count] = {RGB(255, 0, 0)};
    
    SetSysColors(count, elements, colors);
    

    Dummerweise gilt das dann global für alle Fenster/Anwendungen der aktuellen Session.



  • @hustbaer
    Danke für deinen Tipp, leider war das die Farbe für den markierten Text.



  • Vllt. hilft der vorletzte Beitrag aus changing CEdit border color (WS_EX_STATICEDGE + WM_NCPAINT)?

    Ansonsten habe ich noch einen Beitrag für WinForms (C#) gefunden: Change the borderColor of the TextBox


Anmelden zum Antworten