C#重绘闪烁

时间:2013-09-29 06:58:52

标签: c# .net winforms

我有UserControl:Panel。当我添加到Form自己的UserControl。 UserControl.Anchor =左|右|上|下。当我调整窗体矩形的大小时闪烁。怎么能让它不眨眼?

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

2 个答案:

答案 0 :(得分:2)

你可以做很多事情来减少闪烁:

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

答案 1 :(得分:1)

尝试设置doubleBuffered = true,您不必在疼痛事件中创建图形对象。你可以从事件args那里得到它。您必须确保在绘画事件中执行最少量的任务。

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