我做了一个班级GradientButton
,假设是一个充满渐变背景的按钮。
我在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
方法之前调用。
答案 0 :(得分:3)
这是因为Button
类设置了ControlStyles.Opaque标志,根据文档提供:
如果为true,则控件将被绘制为不透明且背景未绘制。
您可以在类构造函数中将其关闭
SetStyle(ControlStyles.Opaque, false);
将调用您的OnPaintBackground
覆盖。
然而,它没有多大帮助 - 有一个原因要将标志设置为true
- OnPaint
同时绘制按钮的背景和面部,所以无论你在{{{{}}做什么1}}对按钮外观没有任何影响。不幸的是,没有选项只绘制背景,所以你需要覆盖OnPaintBackground
并实际自己绘制一切。
答案 1 :(得分:0)
您需要在构造函数中设置表单的样式...
this.SetStyle(ControlStyles.UserPaint, true);
确保覆盖OnPaint方法。 ControlStyle有许多可以组合的设置
答案 2 :(得分:-1)
我会这样做。
首先,将构造函数更改为:
public GradientButton()
{
Color1 = Color.YellowGreen;
Color2 = Color.LightGreen;
Angle = 30;
Paint += new PaintEventHandler(GradientButton_Paint);
}
然后添加以下程序:
private void GradientButton_Paint(object sender,PaintEventArgs e)
{
Debug.WriteLine("This never prints");
using (LinearGradientBrush brush = new LinearGradientBrush(this.ClientRectangle,Color1,Color2,Angle))
{
e.Graphics.FillRectangle(brush, this.ClientRectangle);
}
}
我不完全确定您的代码无法正常工作,但我所描述的方式始终适用于我。希望这很好。