如何避免在Form.Invalidate()中闪烁

本文关键字:闪烁 Invalidate 何避免 Form | 更新日期: 2023-09-27 18:15:53

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

如何避免在Form.Invalidate()中闪烁

需要设置属性DoubleBuffered为true

因为它是一个受保护的属性,你需要创建你自己的控件:

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

您可能需要先在内存位图上完成所有绘图,然后将该位图绘制到表单上,以便它一次绘制在屏幕上。

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保存在周围,它应该在每次绘画时创建和处理。

人们说使用DoubleBufferred = true;,但您可以轻松地将表单上的DoubleBufferred参数更改为true,而无需使用代码。