Anzeigefehler bei Farbiger Editbox
-
Hallo,
Ich schreibe gerade an einem Program bei dem ich zur Laufzeit die Hintergrundfarbe einer Mehrzeiligen Editbox ändern möchte.
Sprich: wenn die Editbox leer ist, ist der Hintergrund rot, wenn Text drinnen steht is der Hintergrund grün. Das hab ich mitOnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)gemacht und funktioniert soweit auch.
OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); HBRUSH hBGreen = CreateSolidBrush(RGB(136, 255, 0)); HBRUSH hBRed = CreateSolidBrush(RGB(207, 0, 0)); if(pWnd->GetDlgCtrlID() == IDC_EDIT_SCHAUSPIELER) { pWnd = GetDlgItem( IDC_EDIT_BESCHR ); pDC->SetBkMode(TRANSPARENT); // pDC->SetTextColor(RGB(255, 255, 225)); if( m_sSchauspieler.IsEmpty() ){ pDC->SetBkColor(RGB(207, 0, 0)); return hBRed; } else{ pDC->SetBkColor(RGB(136, 255, 0)); return hBGreen; } } return hbr; }Mein Problem ist nun folgendes: Wenn in der Editbox soviel text drinnen steht das man ihn Scrollen kann, dann wird der Text nichtmehr aktualisiert und alles verschwimmt zu einem unlesbaren geschmier, wie hier auf dem Bild zu sehen ist. Irrgendwann hängt sich dann auch das ganze Programm auf, bzw wird ganz komisch dargestellt und reagiert auf keine Eingaben mehr. RedrawWindow() oder so bringen auch nichts. Wenn ich den Hintergrund in der Standard Farbe lass funkioniert alles wunderbar. Hoffe mir kann jemand weiterhelfen um dieses lässtige Problem loszuwerden.
Für mehr Informationen einfach fragen.Vielen Dank schon mal im voraus
-
Logisch. Das liegt an Deinem SetBkMode Transparent!
Du musst dem Control erlauben beim Textzeichnen auch den Background zu übermalen!
-
Okay, hast recht. Wenn ich SetBkMode entfern ist das Problem mit dem verschwommenen Text weg. Allerdings reagiert die Editbox jetz nich mehr richtig drauf ob da Text drinnen steht oder nicht. Die Farbe springt jetzt irrgendwann um. Und der Hintergrund wird an den rändern nicht richtig gezeichnet. siehe Bild
-
So hab das Problem gelöst mit dem Hintergrund. Hab nun ein
OnEnChangeEditSchauspieler()eingefügt. Dort mach ich dann
Invalidate(); UpdateWindow();Damit ist der Hintergrund wieder komplett da. Danke für deine Hilfe.
-
Wenn Du das Editcontrol selbst ableitest passiert sowas nicht.
Ist auch IMHO die beste Lösung dafür.
Schau dir das mal bei Codeguru oder Codeproject an.
Dort gibt bereits genug Controls die abgeleitet sind.