双面板缓冲

时间:2011-09-27 12:55:56

标签: c# winforms panel system.drawing double-buffering

通过将“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。它是滞后的,即使它用在一个小图纸上,我有一些我在表格和其他东西中使用的自定义资源,因为我不会把整个表格变成一张图纸。第二个似乎会引起问题。还有其他方法吗?

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

3 个答案:

答案 0 :(得分:9)

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

using System;
using System.Windows.Forms;

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我应该在很久以前发布我的解决方案......

嗯,这是我的解决方案:

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,但在应用新图像时已经证明它更慢。我读过的地方,最好使用Panel而不是PictureBox。我不知道是否必须在代码中添加一些内容以加快Panel的速度。