双面板缓冲

可以通过将“AllPaintingInWmPaint”,“UserPaint”和“DoubleBuffer”ControlStyles的值设置为“true”来完成对整个表单的双缓冲(this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer,true)) 。

但是System.Windows.Forms.Panel不会发生这种情况,因为该类不允许我这样做。 我找到了一个解决方案: http : //bytes.com/topic/c-sharp/answers/267635-double-buffering-panel-control 。 我也试过这个: Winforms Double Buffering 。 这是滞后的,即使它在小图纸上使用,我也有一些自定义资源,我在表格和其他东西中使用,因为我不会把整个表格变成一张图纸。 而第二个似乎会引起问题。 还有其他方法吗?

我问这个是因为我不希望面板上的绘图在调整窗体大小时一直闪烁。 如果有办法在没有双缓冲的情况下摆脱闪烁,我会很高兴知道。

如果您不需要滚动支持,请使用PictureBox,默认情况下它是双缓冲的。 获得双缓冲可滚动面板非常简单:

using System; using System.Windows.Forms; class MyPanel : Panel { public MyPanel() { this.DoubleBuffered = true; this.ResizeRedraw = true; } } 

ResizeRedraw分配禁止容器控件的绘制优化。 如果你在面板上做任何绘画,你将需要这个。 如果没有它,当您调整面板大小时,绘画会变脏。

双缓冲实际上使绘画变慢。 这会对稍后绘制的控件产生影响。 他们在被填充之前留下的洞可能会被看到一段时间,也被认为是闪烁。 你会在这个答案中找到反对效果的反措施。

如果可以接受,你可以在resize时停止刷新面板并在之后再次启用它,这样你就可以摆脱丑陋的闪烁。

我很久以前就应该发布我的解决方案……

嗯,这是我的解决方案:

 Bitmap buffer = new Bitmap(screenWidth, screenHeight);//set the size of the image System.Drawing.Graphics gfx = Graphics.FromImage(buffer);//set the graphics to draw on the image drawStuffWithGraphicsObject(gfx);//draw pictureBox1.Image = buffer;//set the PictureBox's image to be the buffer 

在问这个问题多年之后,让我感觉自己是一个完全白痴。

我已经尝试使用Panel,但在应用新图像时已经certificate它更慢。 我读过的地方,最好使用Panel而不是PictureBox。 我不知道是否必须在代码中添加一些内容以加快Panel的速度。