Edit control farbig

Thomasio

Erfahrenes Mitglied
Ich habe irgendwas verhunzt und ich finde nicht heraus was, vielleicht sieht ja jemand von euch meinen Fehler

Ein ganz simples "edit" Feld

Code:
Myinput     = CreateWindowEx(
                                WS_EX_CLIENTEDGE,
                                "edit", NULL,
                                WS_CHILD | WS_VISIBLE | ES_MULTILINE,
                                2, 53, 295, 150,
                                hWnd, NULL,
                                hinstance,
                                NULL
                               );

ohne Subclass oder sonstwas, funktioniert erstmal prima

Nun will ich dem Feld einen farbigen Hintergrund geben, also mache ich im parent:

Code:
case WM_CTLCOLOREDIT:
{
    SetBkMode((HDC) wParam, TRANSPARENT);
    SetTextColor((HDC) wParam, RGB(184,184,210) );
    return (LONG) mybrush;
}
break;

Das sieht auf den ersten Blick prima aus, Hintergrundfarbe stimmt, ich kann mit der gewählten Textfarbe reinschreiben, so weit ok
Aber wenn ich versuche ein Stück vom Text zu löschen, dann refresht er das Feld nicht, sprich der alte Text bleibt sichtbar obwohl nicht mehr vorhanden
Erst wenn ich den gesamten Text aus dem Feld lösche macht er das Feld tatsächlich leer
Text überschreiben führt dazu dass er alt und neu übereinander zeichnet, wie eine alte Schreibmaschine
Das Gleiche passiert auch wenn ich dem Fenster einen Scroll gebe, viel Text rein schreibe und scrolle, dann zeichnet er immer wieder drüber, ohne das was vorher da war zu löschen

Ich habe es ein Dutzend mal vorwärts und rückwärts probiert, ohne WM_CTLCOLOREDIT funktioniert alles einwandfrei, mit Farbe ist Chaos

Was habe ich da übersehen?
 
Die beschriebenen Symptome sind genau das was du mit
SetBkMode((HDC) wParam, TRANSPARENT);
und mit einem Hollow-Brush bewirkst: Windows malt mit diesem Brush einfach mit einer Rectangle() Methode o.ä. über den Edit, und da im Normalfall es eine Hintergrundsfarbe gibt, wird alles gelöscht bevor der neue Text gemalt wird.
Im diesem Fall tuht der Rectangle() Aufruf von Windows einfach garnichts und laesst die Pixel von vorhin einfach stehen, daher die Schmiere. :)

Ich weiss nicht ob WS_EX_TRANSPARENT vielleicht helfen kann...
Die Idee ist aber eigentlich das was das standarte Edit nicht macht, selber zu machen, und zwar die Pixel davon, was unter dem Edit drunterliegt, auf den Edit zu Kopieren.
Einfach nach "transparent edit control" :google:'n dann kommen nuetzliche Artickel.

natuerlich, falls bei dir nur eine durchgehende Farbe unter den Edit's liegt, waere es einfacher sich die Arbeit zu sparen und gleich einen Brush mit dieser Farbe zu nehmen.
 
mybrush ist keine Hollow, sondern eine SolidBrush, ich habe sie nur vorher definiert, weil ich sie in mehreren Feldern verwende, trotzdem macht er das nicht

Ich habe in einer anderen Anwendung an gleicher Stelle eine bmp als Hintergrund, damit geht es
Ganz umständlich, wenn ich bei Programmstart eine globale Bitmap erstelle, die einfach nur die Grösse des edit Feldes hat und im WM_SIZE ein FillRect mit genau dieser mybrush macht und dann dem Coloredit diese Bitmap zurückgebe funktioniert es auch

Nur wenn ich ihm einfach die mybrush gebe, dann geht es nicht

Setze ich BkMode nicht auf transparent und definiere statt dessen eine Hintergrundfarbe geht es natürlich auch, aber dann flackert das edit Feld bei jeder Änderung im Text, weil er es in 2 Schritten, zuerst löscht und dann neu zeichnet
 
Zurück