2012-07-05 71 views
1

我遇到了幾種將漸變樣式應用於Windows窗體應用程序中的對象的方法。所有的方法都涉及覆蓋OnPaint方法。但是,我正在根據驗證在運行時查看更改風格。應用新顏色(使用漸變)獲取窗體按鈕onClick

如何將新漸變樣式應用於已經呈現的按鈕(就像我可以使用BackColor一樣)?

R, C.

UPDATE:這是我目前正在使用的代碼。這似乎沒有任何效果

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(); 
} 

回答

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()MyFormIsValid()方法。

這裏的整個事情作爲一個可運行示例程序:http://pastebin.com/cfXvtVwT

+0

謝謝,但我仍然沒有發生任何事情。通過我的代碼,我可以確認兩行(添加新的PaintEventHandler並調用Invalidate())正在被擊中。但是,函數Button_Paint沒有被調用。我甚至在按鈕上添加了一個Refresh(),沒有任何改變。 – 2012-07-05 14:04:15

+0

奇怪...我有這個作爲示例應用程序運行...我會發布整個事情。 – andypaxo 2012-07-05 14:11:21

+0

謝謝。我將用我正在運行的代碼更新我的問題。 – 2012-07-05 14:15:28

2

正如你所看到的,你需要處理Paint事件。

您可以在類中設置布爾值來指示是否繪製漸變。

+0

+1,你能告訴我們的代碼?或[SO]引用 – 2012-07-05 11:31:41

+0

我將包含用於覆蓋表單(在渲染)很快的代碼。我仍然不確定如何用類似的方法重載按鈕Paint事件。 – 2012-07-05 11:34:06