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

C# 如何避免在Form.Invalidate()中闪烁?,c#,invalidation,C#,Invalidation,我正在使用f.Invalidate()在我的C#程序中重新绘制图形,但图形在刷新时会闪烁。我还在f_Paint()方法中使用e.Graphics.DrawImage()。您需要将双缓冲设置为true 因为它是受保护的属性,所以您需要自己进行控制: class Canvas : Control { public Canvas() { DoubleBufferred = true; } } 您可能需要首先对内存中的位图进行所有绘制,然后将该位图绘制到窗体中,以便一次在屏幕上绘制所有位图 I

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

您需要将
双缓冲
设置为true

因为它是受保护的属性,所以您需要自己进行控制:

class Canvas : Control {
    public Canvas() { DoubleBufferred = 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();

您可以将
缓冲区
保留更长的时间,而不是每帧重新创建一次,从而提高效率。但是不要把它放在周围,它应该在你每次画画的时候被创建和处理。

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

我该怎么做?它是表单下的方法吗?它是
控件的一个属性。
最简单的方法就是这样做。DoubleBuffered=true在窗体的加载事件中。我不熟悉控件。哈哈,我输入了控件。但是没有双缓冲区。我也试过这个。双缓冲,但这个。也没有双缓冲。然后我尝试了f.DoubleBuffered,但它说由于保护级别的原因,它无法访问。怎么了?o、 o所有这些注释都可以用来更好地回答问题,这样我们就不会沉溺于注释中。声明的位图avatar=新位图(Bitmap.FromFile(“filename.png”);然后是e.Graphics.DrawImage(头像,1,1,100,100)对,用你所有相同的绘图代码替换我的“在这里绘制你的东西”注释,但是使用
gr
而不是
e.Graphics
。这将有效地缓冲所有图形调用,并使它们立即绘制到屏幕上,从而消除闪烁。设置
this.DoubleBuffered=true正如SLaks所说,可能也会有所帮助。您可能还需要重写Background Paint方法,而不调用base.OnPaintBackground-这不是必需的,如果不这样做,您就不会“清除”前面的内容。颜色深度重要吗?如何设置颜色深度?它不起作用。它表示“字段初始值设定项不能引用非静态字段、方法或属性..”