1

我有用户控制:面板。当我添加到表单自己的用户控件时。UserControl.Anchor = 左|右|上|下。当我调整 Form Rectangle 的大小时,它会闪烁。你怎么能让它不眨眼?

public partial class UserControl1 : Panel
{
    public UserControl1()
    {
        InitializeComponent();
        this.ResizeRedraw = true;
    }

    private void UserControl1_Paint(object sender, PaintEventArgs e)
    {
        using (Graphics g = this.CreateGraphics())
        {
            Pen pen = new Pen(Color.Black, 1);
            Brush brush = new SolidBrush(Color.Black);

            g.DrawRectangle(pen, 0, 0, this.Width - 1, this.Height - 1);

            pen.Dispose();
        }
    }
}
4

2 回答 2

2

您可以采取许多措施来减少闪烁:

  • 通过将不必要的工作移出方法来使您的绘画处理程序尽可能快(例如,在方法之外创建画笔和钢笔并缓存它们以避免每次绘画的创建成本;使用 gfx.Clear 清除背景而不是填充矩形;重新设计你的显示器,这样你就不必画太多东西;在位图中缓存部分图像,以便更快地重绘它们)
  • 避免多次绘制每个像素(如果你用白色填充背景,然后用黑色覆盖它,它会闪烁。但如果你绘制一个白色矩形,然后用黑色在它周围画一个框架,你可以避免闪烁)
  • 仅通过检查剪辑矩形来绘制图形的可见部分,以避免绘制当前不可见的东西)
  • 通过覆盖擦除背景处理,确保框架不会为您填充背景(通常为白色)。
  • 启用双缓冲,以便消除任何剩余的闪烁。这比其他方法使用更多的资源,尽管现在这通常不是什么大问题。
  • 使用红色现有 e.Graphics 绘制而不是调用 CreateGraphics
于 2013-09-29T09:32:23.883 回答
1

尝试设置doubleBuffered = true,您不必在疼痛事件中创建图形对象。你可以从事件参数中得到。您必须确保在绘画事件中完成最少的任务。

public partial class UserControl1 : Panel
{
    public UserControl1()
    {
        InitializeComponent();
        this.ResizeRedraw = true;
        this.DoubleBuffered = true;
    }

    private void UserControl1_Paint(object sender, PaintEventArgs e)
    {
        var g = e.Graphics;
        Pen pen = new Pen(Color.Black, 1);
        Brush brush = new SolidBrush(Color.Black);
        g.DrawRectangle(pen, 0, 0, this.Width - 1, this.Height - 1);
    }
}
于 2013-09-29T07:03:30.410 回答