abgeleitet wird. Ich habe eine Klasse GradientButton
erstellt, bei der es sich um einen Button handelt, der mit Hintergrund mit Farbverlauf gefüllt ist.Die OnPaintBackground-Methode wird nie für das Steuerelement aufgerufen, das von Button
Ich zeichne Gradientenfüllung in der OnPaintBackground()
Methode. Leider ist es nie aufgerufen, natürlich habe ich eine GradientButton
zu einem Form
über Toolbox:
public class GradientButton : Button {
public Color Color1 { get; set; }
public Color Color2 { get; set; }
public float Angle { get; set; }
public GradientButton() {
Color1 = Color.YellowGreen;
Color2 = Color.LightGreen;
Angle = 30;
}
protected override void OnPaintBackground(PaintEventArgs e) {
base.OnPaintBackground(e);
Debug.WriteLine("This never prints");
using (LinearGradientBrush brush = new LinearGradientBrush(this.ClientRectangle,
Color1,
Color2,
Angle)) {
e.Graphics.FillRectangle(brush, this.ClientRectangle);
}
}
protected override void OnResize(EventArgs e) {
base.OnResize(e);
Invalidate();
}
}
Frage:, wie der Hintergrund der Schaltfläche füllen mit dem Farbverlauf? Warum wird OnPaintBackground
nicht aufgerufen? Soweit ich weiß, sollte es vor OnPaint
Methode aufgerufen werden.
Es wird normalerweise von WM_ERASEBKGND ausgelöst, aber diese Nachricht wird [spezielle Behandlung] (http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Button.cs,db879261d0cac688) in Button.WndProc(), unter Umgehung der normalen Handhabung. Der Vorteil ist, dass keine Doppelpufferung erforderlich ist. Es wird nicht benötigt, OnPaint() zeichnet alles. Sie müssen stattdessen OnPaint() überschreiben. –