2010-06-04 78 views
0

我在使用漸變繪圖調用時遇到問題。我有一個看起來像這樣的表單。漸變繪圖錯誤

Screenshot http://img413.imageshack.us/img413/3570/30364682.png

的問題是現在每一次上述漸變,用於繪製錯誤就會開始發生。當然,它應該是正確的。有時只需要一些構建 - 重建 - 混搭來修復,並且在構建完成後,它只是簡單地「開始」。

該控件(頂部白色部分)是TableLayoutPanel。該BackColor設置爲白色,並在面板的Paint事件我這樣做:

/// <summary> 
/// Draws the background gradient. 
/// </summary> 
private void titleBarLayoutPanel_Paint(object sender, PaintEventArgs e) 
{ 
    Brush brush = new LinearGradientBrush(titleBarLayoutPanel.Bounds, TaskHeaderLeftColor, TaskHeaderRightColor, LinearGradientMode.Horizontal); 
    e.Graphics.FillRectangle(brush, titleBarLayoutPanel.Bounds); 
} 

我應該做別的事情?問題是,它的工作原理,然後沒有重建或建立這將開始發生!

編輯我已經重建了它所包含的類庫(它是一個通用的表單),然後重新構建了它所用的應用程序,並且漸變現在完全填滿了。這是奇怪的。

回答

1

建設和重新構建應用程序,沒有任何變化,一般不會解決這個問題(或幾乎所有對於這個問題,另一個bug)保存那些你沒有先執行clean/rebuild然後注意到你剛剛編寫的代碼沒有運行(不確定這些日子是否可以用IDE)的應用程序。我看到很多新開發人員在重建期間希望以某種方式編譯器能夠使代碼「正確」,或者編譯器可能無法生成正確的代碼。 (請注意,我並不是指貶低地提到上述言論。)

要解決此問題,您可以嘗試派生自己的TableLayoutPanel類,在該類中重寫OnBackgroundPaint事件,繪製自己的背景或只需返回,如果你不想畫自己的背景。 (您似乎正在繪製背景中的Paint事件)。你在上面的代碼中所做的只是繪製在已經由控件繪製的背景上,因此你看到的「bug」(雙重繪製)。看起來表單不可調整大小。嘗試使其可調整大小。然後調整它的大小並觀察它的顏色,或者只是將其他窗口移動到其上。

class CustomTableLayoutPanel : TableLayoutPanel 
{ 
    protected override void OnPaintBackground(PaintEventArgs e) 
    { 
     Brush brush = new LinearGradientBrush(this.ClientRectangle, TaskHeaderLeftColor, TaskHeaderRightColor, LinearGradientMode.Horizontal); 
     e.Graphics.FillRectangle(brush, this.ClientRectangle); 
     //base.OnPaintBackground(e); 
    } 
} 
+0

這工作正常。我意識到重建不會改變代碼的行爲方式,但是在幾個構建之間間歇性地工作/出錯仍然很奇怪。 – 2010-06-04 04:46:35

+0

原來它現在再做一次!沒有那麼多的第二天開放項目,並運行它。 /哭聲。 – 2010-06-08 04:16:49

+0

我改變了'FillRectangle'調用以使用'e.ClipRectangle'。它現在正在工作,但我不確定是否修復它。 – 2010-06-08 04:35:17

0

順便說一下,您應該將Bounds替換爲ClientRectangle
Bounds是控件的矩形相對於其父項; ClientRectangle是相對於控制本身。
在這種特殊情況下,也不會有所作爲,因爲控制爲0,0。

+0

謝謝。我會記住的。 – 2010-06-04 01:37:19