0

我有一个面板控件,我想用渐变填充。我有以下代码:

Brush brush = new LinearGradientBrush(pnlBody.ClientRectangle, Color.Black, Color.White, LinearGradientMode.ForwardDiagonal);
pnlBody.CreateGraphics().FillRectangle(brush, pnlBody.ClientRectangle);

但它没有效果。如果我用表单替换 pnlBody,那么它会很好地为表单着色,但不会为面板着色。任何想法我做错了什么?谢谢!

4

1 回答 1

6

Panel 控件将使用其 Paint 事件绘制自己。这会清除您使用 CreateGraphics() 绘制的任何内容。您需要改用它的 Paint 事件。然而,这会产生闪烁,你会看到它首先绘制它的背景。面板还经过优化,可用作具有低影响绘制开销的容器控件,您会看到它在调整大小时不会重新绘制自身。当您将其锚定到右侧或底部并调整表单大小时出现问题。

要解决这些问题,您应该从 Panel 派生您自己的类。在您的项目中添加一个新类并粘贴以下代码:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

public class GradientPanel : Panel {
    public GradientPanel() {
        this.ResizeRedraw = true;
    }
    protected override void OnPaintBackground(PaintEventArgs e) {
        using (var brush = new LinearGradientBrush(this.ClientRectangle, 
                   Color.Black, Color.White, LinearGradientMode.ForwardDiagonal)) {
            e.Graphics.FillRectangle(brush, this.ClientRectangle);
        }
    }
    protected override void OnScroll(ScrollEventArgs se) {
        this.Invalidate();
        base.OnScroll(se);
    }
}

构建+构建。将新控件从工具箱顶部拖放到表单上,替换原来的面板。您可以通过添加选择渐变开始和结束颜色的属性来获得创意,从而产生更普遍有用的控件,可以在其他项目中重复使用。请避免面板显示滚动条,因为 Windows 的“拖动时显示窗口内容”功能,您无法使滚动看起来不错。效果有点类似于 pogo。

于 2013-04-29T13:09:22.047 回答