2010-06-04 98 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