Я создал класс GradientButton
, который предположительно будет кнопкой, заполненной градиентным фоном.Метод OnPaintBackground никогда не вызывается для управления, полученного из Button
Я рисую градиентное заполнение в методе OnPaintBackground()
. К сожалению, он никогда не вызывается, конечно, я добавил GradientButton
к Form
через панель инструментов:
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();
}
}
Вопрос: Как заполнить фон баттона с градиентом? Почему OnPaintBackground
не вызывается? Насколько мне известно, его следует называть до OnPaint
.
Обычно это вызвано WM_ERASEBKGND, но это сообщение получает [специальное обращение] (http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Button.cs,db879261d0cac688) в Button.WndProc(), минуя обычную обработку. Преимущество заключается в том, что не требуется двойной буферизации. Он не нужен, OnPaint() рисует все. Вы, в свою очередь, должны переопределить OnPaint(). –