【发布时间】:2011-11-28 15:30:41
【问题描述】:
我正在使用f.Invalidate() 在我的 C# 程序中重新绘制图形,但图形在刷新时会闪烁。我还在f_Paint() 方法中使用e.Graphics.DrawImage()。
【问题讨论】:
标签: c# invalidation
我正在使用f.Invalidate() 在我的 C# 程序中重新绘制图形,但图形在刷新时会闪烁。我还在f_Paint() 方法中使用e.Graphics.DrawImage()。
【问题讨论】:
标签: c# invalidation
您需要将DoubleBuffered 设置为true。
由于它是受保护的属性,因此您需要自行控制:
class Canvas : Control {
public Canvas() { DoubleBufferred = true; }
}
【讨论】:
Control的属性。
this.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,每次绘画时都应该创建和处理它。
【讨论】:
gr 而不是e.graphics。这将有效地缓冲所有绘图调用并让它们立即绘制到屏幕上,消除闪烁。像 SLaks 所说的那样设置 this.DoubleBuffered = true; 也可能会有所帮助。
人们都说用DoubleBufferred = true;,但是你可以很容易地将表单上的DoubleBufferred参数更改为true,而不需要使用代码。
【讨论】: