永远不会为从Button派生的控件调用OnPaintBackground方法

时间:2016-04-22 12:29:19

标签: c# winforms gradient

我做了一个班级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方法之前调用。

3 个答案:

答案 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);
        }
    }

我不完全确定您的代码无法正常工作,但我所描述的方式始终适用于我。希望这很好。