【问题标题】:How to avoid blinking in Form.Invalidate()?如何避免在 Form.Invalidate() 中闪烁?
【发布时间】:2011-11-28 15:30:41
【问题描述】:

我正在使用f.Invalidate() 在我的 C# 程序中重新绘制图形,但图形在刷新时会闪烁。我还在f_Paint() 方法中使用e.Graphics.DrawImage()。

【问题讨论】:

    标签: c# invalidation


    【解决方案1】:

    您需要将DoubleBuffered 设置为true。

    由于它是受保护的属性,因此您需要自行控制:

    class Canvas : Control {
        public Canvas() { DoubleBufferred = true; }
    }
    

    【讨论】:

    • 我该怎么做?是Form下的方法吗?
    • 这是Control的属性。
    • 最简单的方法是在表单的加载事件中执行this.DoubleBuffered = true;。
    • 我对 Control 不熟悉。哈哈。我输入了控制。但没有双缓冲。我也试过 this.DoubleBuffering 但是这个。也没有双缓冲。然后我尝试了 f.DoubleBuffered 但它说由于保护级别而无法访问。怎么了? o.O
    • 所有这些 cmets 都可以用来改善答案,这样我们就不会被 cmets 淹没
    【解决方案2】:

    您可能需要先在内存中的位图上进行所有绘制,然后将该位图绘制到表单上,以便一次将其全部绘制在屏幕上。

    Image buffer = new Bitmap(width, height, colorDepth); //I usually use 32BppARGB as my color depth
    Graphics gr = Graphics.fromImage(buffer);
    
    //Do all your drawing with "gr"
    
    gr.Dispose();
    e.graphics.drawImage(buffer,0,0);
    buffer.Dispose();
    

    您可以通过将buffer 保持更长时间而不是每帧都重新创建它来提高效率。但不要保留gr,每次绘画时都应该创建和处理它。

    【讨论】:

    • 我声明了Bitmap avatar = new Bitmap(Bitmap.FromFile("filename.png"));然后 e.Graphics.DrawImage(avatar, 1, 1, 100, 100)
    • 对,只需用所有相同的绘图代码替换我的“在这里画你的东西”评论,但使用gr 而不是e.graphics。这将有效地缓冲所有绘图调用并让它们立即绘制到屏幕上,消除闪烁。像 SLaks 所说的那样设置 this.DoubleBuffered = true; 也可能会有所帮助。
    • 您可能还需要覆盖 Background Paint 方法并且不要调用 base.OnPaintBackground - 这不是必需的,如果不这样做,您不会“清除”以前的内容。
    • 颜色深度重要吗?如何设置颜色深度?
    • 它不工作。它说“字段初始化程序不能引用非静态字段、方法或属性..”
    【解决方案3】:

    人们都说用DoubleBufferred = true;,但是你可以很容易地将表单上的DoubleBufferred参数更改为true,而不需要使用代码。

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 2013-05-02
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 2023-03-22
      • 2013-11-16
      相关资源
      最近更新 更多