代码之家  ›  专栏  ›  技术社区  ›  Nick Bedford

渐变绘图错误

  •  0
  • Nick Bedford  · 技术社区  · 15 年前

    我打电话有麻烦。我有一张这样的表格。

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

    我应该做点别的吗?问题是,它的工作,然后没有这么多的重建或建设,这将开始发生!

    编辑 从那以后,我重建了它所包含的类库(它是一个通用的形式),然后重建了它所使用的应用程序,渐变现在已经完全填满了。这很奇怪。

    2 回复  |  直到 15 年前
        1
  •  1
  •   user113476 user113476    15 年前

    构建和重新构建应用程序,不做任何更改,通常不会解决这个问题(或者大多数其他的bug),保存运行应用程序时没有先进行清理/重建,然后注意到您刚刚编写的代码没有运行(现在不确定IDE是否可能)。我在新的开发人员身上看到了很多这样的情况,他们一直在重建,希望编译器能以某种方式使代码“正确”,或者可能编译器根本没有生成正确的代码(请注意,我并不是指上述声明被轻视。)

    要解决当前的问题,可以尝试派生自己的TableLayoutPanel类,在该类中重写OnBackgroundPaint事件,绘制自己的背景,或者如果不想绘制自己的背景,则直接返回(你好像在画这幅画 油漆 事件)。您在上面的代码中所做的只是在控件已经绘制的背景上进行绘制,因此您看到的“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);
        }
    }
    
        2
  •  0
  •   SLaks    15 年前

    Bounds 具有 ClientRectangle
    界限 控件相对于其父控件的矩形; 是相对于控件本身的。
    在这种特殊情况下,它不会有什么区别,因为控件位于0,0。