【问题标题】:Apply new colour (with Gradient) to Win Forms button onClick将新颜色(带渐变)应用到 Win Forms 按钮 onClick
【发布时间】:2012-07-05 11:27:14
【问题描述】:

我遇到了几种将渐变样式应用于 Windows 窗体应用程序中的对象的方法。所有方法都涉及重写 OnPaint 方法。但是,我正在根据验证在运行时更改样式。

如何将新的渐变样式应用到已经渲染的按钮(就像我可以使用 BackColor 一样)?

R, C.

更新:这是我目前使用的代码。好像没有效果

private void Button_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        g.DrawString("This is a diagonal line drawn on the control",
            new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30));
        g.DrawLine(System.Drawing.Pens.Red, btn.Left, btn.Top,
            btn.Right, btn.Bottom);

        this.btn.Invalidate();
    }

被调用

btn.Paint += new PaintEventHandler(this.Button_Paint);

使用当前代码进一步更新

private void Button_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawString("This is a diagonal line drawn on the control",
        new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30));
g.DrawLine(System.Drawing.Pens.Red, btn.Left, btn.Top,
        btn.Right, btn.Bottom);
}

private void btn_Click(object sender, EventArgs e)
{
btn.Paint += new PaintEventHandler(this.Button_Paint);();
btn.Invalidate();
}

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    这有两个部分。一,正如 SLaks 所说,您需要在 Paint 事件处理程序中绘制渐变。这看起来像这样(为了简洁起见,我的示例有点混乱):

    private void Button_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        if (MyFormIsValid()) {
            g.DrawString("This is a diagonal line drawn on the control",
                new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30));
            g.DrawLine(System.Drawing.Pens.Red, btn.Left, btn.Top,
                btn.Right, btn.Bottom);
        }
        else {
            g.FillRectangle(
                new LinearGradientBrush(PointF.Empty, new PointF(0, btn.Height), Color.White, Color.Red),
                new RectangleF(PointF.Empty, btn.Size));
        }
    }
    

    此外,您需要进行验证并在单击按钮时重绘按钮:

    btn.Click += Button_Click;
    

    ...

    private void Button_Click(object sender, EventArgs e)
    {
        DoValidations();
        btn.Invalidate();
    }
    

    当然,您必须实现 DoValidations()MyFormIsValid() 方法。

    这是一个可运行的示例程序的全部内容:http://pastebin.com/cfXvtVwT

    【讨论】:

    • 谢谢,但我仍然没有任何反应。单步执行我的代码,我可以确认这两行(添加新的 PaintEventHandler 和调用 Invalidate())正在被命中。但是,没有调用函数 Button_Paint。我什至在按钮上添加了 Refresh(),没有任何变化。
    • 奇怪...我将其作为示例应用程序运行...我将发布整个内容。
    • 找出你的工作原理......你在运行时创建按钮。我的是在设计时创建的。我想我也必须将它创建为运行时。
    • 在设计器中创建控件似乎不太可能是问题所在。它更有可能与您附加事件处理程序的位置有关,但我不确定。
    • 这是...将其移至在运行时创建已解决问题。
    【解决方案2】:

    如您所见,您需要处理Paint 事件。

    你可以在你的类中设置一个布尔值来指示是否绘制渐变。

    【讨论】:

    • 我将很快包含用于覆盖表单(在渲染时)的代码。我仍然不确定如何用类似的东西覆盖按钮 Paint 事件。
    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    相关资源
    最近更新 更多