1

我遇到了几种将渐变样式应用于 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();
}
4

2 回答 2

3

这有两个部分。一,正如 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()andMyFormIsValid()方法。

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

于 2012-07-05T13:52:16.947 回答
2

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

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

于 2012-07-05T11:28:35.097 回答