4

通过将“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。它很滞后,即使它用于小图纸,我也有一些自定义资源,我在表单和其他东西中使用这些资源,因此我不会将整个表单变成一张图纸。第二个似乎会引起问题。还有其他方法可以做到这一点吗?

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

4

3 回答 3

10

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

using System;
using System.Windows.Forms;

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

ResizeRedraw 分配抑制容器控件的绘画优化。如果您在面板中进行任何绘画,您将需要这个。没有它,当您调整面板大小时,绘画会模糊不清。

双缓冲实际上使绘制速度变慢。这可能会对稍后绘制的控件产生影响。他们在被填满之前留下的洞可能会在一段时间内可见,也被认为是闪烁。您将在此答案中找到针对该效果的对策。

于 2011-09-27T13:07:39.227 回答
3

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

好吧,这是我的解决方案:

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。不过,我不知道是否必须在代码中添加一些内容以加快面板的速度。

于 2016-09-21T17:36:48.600 回答
1

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

于 2011-09-27T13:10:15.007 回答