Hintergrundfarbe beim DateTimePicker ändern

04/02/2009 - 15:53 von Rafael G. | Report spam
Hallo NG,

ich àndere immer die Hintergrundfarbe meiner Controls auf ein leichtes
rot, wenn eine Fehleingabe erfolgt ist.
Nun stehe ich vor dem Problem, dass ich bei dem DateTimePicker nicht
ohne weiteres die Hintergrundfarbe àndern kann.
Nun habe ich bissl gegooglt und den Vorschlag gefunden die
BackColor-Eigenschaft zu überschreiben und in der WndProc auf
WM_ERASEBKGND zu reagieren. Das klappt aber bedingt. Unter VISTA wird
bspw. nur kurz die Farbe gewechselt und dann erscheint wieder das
Standard-Weiss. Hat jemand vielleicht eine bessere Lösung parat?

Mein Quellcode:

private SolidBrush m_BackBrush;

[Browsable(true)]
public override Color BackColor
{
get
{
return base.BackColor;
}

set
{
base.BackColor = value;
this.m_BackBrush = new SolidBrush(value);
Invalidate();
}
}

protected override void WndProc(ref Message m)
{
const int WM_ERASEBKGND = 20;

if (m.Msg == WM_ERASEBKGND)
{
Graphics g = this.CreateGraphics();
if ( this.m_BackBrush == null)
m_BackBrush = new SolidBrush(this.BackColor);
g.FillRectangle(this.m_BackBrush, this.ClientRectangle);
g.Dispose();
}
else
base.WndProc(ref m);
}

vg
Rafael
 

Lesen sie die antworten

#1 Frank Dzaebel
04/02/2009 - 21:19 | Warnen spam
Hallo Rafael,

ich àndere immer die Hintergrundfarbe meiner Controls auf ein leichtes
rot, wenn eine Fehleingabe erfolgt ist.
Nun stehe ich vor dem Problem, dass ich bei dem DateTimePicker nicht ohne
weiteres die Hintergrundfarbe àndern kann.



Dieser (unsaubere) Workaround mit WM_ERASEBKGND wird
offiziell nicht für den DateTimePicker unterstützt.
(Nebenbei, Graphics hàttest Du die über
FromHDC aus dem WParam holen sollen und "m.Result" hàtte
auch laut Doku noch auf "(IntPtr) 1" gsetzt werden müssen.
Jedoch wird Dir diese Korrektur da nicht helfen.

Unter Vista und höher ergibt sich durch Theming genau der
Effekt, den Du nun beobachtest. Du musst Dir vorstellen,
dass danach noch Zeichaktionen stattfinden, die zum Beispiel
ein langsames Einblenden o.à. bewirken. Das überschreibt
Deinen anfànglichen Hintergrund sozusagen.
Ungeprüft müsste das zum Beispiel durch Vermeidung von:
"Application.EnableVisualStyles();"
zu workarounden sein - ich weiss, das hat andere Nachteile.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen