Edit-Control farbig gestalten



  • Hi,

    ich versuche jetzt schon seit einer Woche, ein EDITTEXT-Control farbig zu gestalten - mit mehr oder weniger Erfolg.

    1. Die Schrift wird mit jedem WM_KEYDOWN fetter, weil der Hintergrund nicht immer übermalt wird (mittels WM_CTLCOLOREDIT), das Problem habe ich gelöst, indem ich den Text mittels WM_GETTEXT etc. lösche und wieder neu schreibe, daher gibt es manchmal ein Flackern. Gibt es da eine bessere Möglichkeit?

    2. Der Text wird leider immer in Großbuchstaben angezeigt. Hab in der Resource

    FONT 9, "Lucida Console", 0, 0, 0x0
    

    stehen. Wie kann ich das beheben?

    Arbeite mit MinGW auf WinXP. Gesucht habe ich auch schon wie sonst was ...

    MfG



  • Zu 1:
    Daß die Schrift mit jedem WM_KEYDOWN fetter wird: Die Ursache kann in Anti-Aliasing des Fonts liegen.

    Siehe "Pitfalls of transparent rendering of anti-aliased fonts":
    http://blogs.msdn.com/oldnewthing/archive/2006/06/14/630864.aspx

    Andere Abhilfe: TrueType Einstellung deaktivieren? Ist das Ergebnis danach anders?

    Zu 2:
    Ganz naive Frage: Der Font enthält sowohl Groß- als auch Kleinbuchstaben? 😉
    Ansonsten habe ich den Stil ES_UPPERCASE stark in Verdacht -> daktivieren oder anderen Stil verwenden!

    Martin



  • Danke für die Antwort 🙂

    Also die Stile hab ich in der Resource-Datei so definiert:

    ES_MULTILINE | ES_AUTOVSCROLL | BS_OWNERDRAW | WS_CHILD | WS_GROUP | ES_AUTOHSCROLL
    

    Das BS_OWNERDRAW bewirkt seltsamerweise gar nichts, ich dachte eigentlich es wäre für das WM_CTLCOLOREDIT erforderlich, trotzdem werden alle anderen Controls auch angesprochen (habe auch WM_CTLCOLORSTATIC in Verwendung, da die Edit-Controls auch manchmal mit ES_READONLY versehen werden).

    Wegen dem Anti-Aliasing gucke ich eben mal nach ...

    [EDIT]
    Also ich hab mal mittels WM_SETFONT Anti-Aliasing angestellt, und jetzt klappt es 😃 Danke für den Tipp!

    Leider ist die Schrift nach wie vor groß.

    [EDIT2]
    Naja es klappt indirekt: Die Schrift wird nicht mehr "überschrieben" (fett), aber wenn ich Text lösche bleibt dieser stehen (wird nicht gelöscht), bis ich beim Anfang der Zeile lande.



  • Ähmmm, moment mal,
    warum brauchst Du BS_OWNERDRAW?

    Um die Schriftfarbe und Hintergrundfarbe des Edit-Controls zu ändern brauchst Du kein Ownerdraw.

    Ein normales Edit-Control sendet WM_CTLCOLOREDIT, bevor es gezeichnet wird. Hier kann das Parent-Fenster die gewünschten Farben bestimmen.

    ABER: Deaktivierte (disabled) und/oder read-only Edit-Controls senden stattdessen WM_CTLCOLORSTATIC!

    Martin



  • Okay, ohne BS_OWNERDRAW ist die Schrift normal 🙄

    WM_CTLCOLORSTATIC benutze ich bereits, davon hatte ich auf MSDN gelesen, glaube ich. Aber das Problem mit dem nicht gelöschten Text bleibt nach wie vor.

    Hier mein Code:

    case WM_CTLCOLOREDIT : 
    	case WM_CTLCOLORSTATIC : {
    
    		switch( GetDlgCtrlID( (HWND) lParam ) ) {
    
    			case IDC_CHAT :
    			case IDC_TEXT : {
    
    				SetBkMode( (HDC) wParam, TRANSPARENT );
    				SetTextColor( (HDC) wParam, RGB( 255, 205, 0 ) );
    
    				return (long) CreateSolidBrush( RGB( 0, 0, 0 ) );
    
    			} break;
    
    		}
    
    		//return (long) CreateSolidBrush( RGB( 255, 255, 255 ) );
    
    	} break;
    

    Das return (long) ... ist wegen den anderen Controls auskommentiert.



  • Diese Zeile

    SetBkMode( (HDC) wParam, TRANSPARENT );
    

    ist verantwortlich dafür, daß Dein Text nicht korrekt gelöscht wird.

    Grund: Der komplette alte Inhalt (Hintergrund und Text) des EditBox wird beim Neuzeichnen als neuen Hintergrund aufgefaßt -> Bei Einstellung TRANSPARENT wird dieser "Hintergrund" eben nicht gelöscht! Und damit bleibt auch der alte Text bestehen.
    Stattdessen den Modus OPAQUE verwenden.

    Martin



  • Vielen Dank, jetzt funktioniert es einwandfrei 🙂
    Musste noch ein SetBkColor hinzufügen, da sonst die aktuelle Zeile noch einen weißen Background hatte.

    Jan



  • Bitte schön 👍


Anmelden zum Antworten