双缓冲与面板双缓冲与面板(Double buffering with Panel)

2019-05-12 03:24发布

(双缓冲整个窗体可以通过设置“UserPaint”和“双缓冲”的ControlStyles为“true”的“AllPaintingInWmPaint”的值来完成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双缓冲 。 这是laggy,即使它是在一个小拉用,我有我使用的形式和其他的东西了一些自定义的资源,因为这些我不会把整个表格到一个绘图。 而第二个似乎导致问题。 是否有其他方法来做到这一点?

我问这个,因为我不想在面板上绘制时被调整表单时闪烁所有的时间。 如果有摆脱没有双缓冲闪烁的一种方式,我会很高兴地知道。

Answer 1:

使用图片框,如果你不需要滚动支持,它是双缓冲的默认。 获得双缓冲滚动面板是很容易的:

using System;
using System.Windows.Forms;

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

该ResizeRedraw分配禁止为容器控件绘制优化。 你需要这个,如果你在面板做任何绘画。 没有它,当你调整绘画涂片面板。

双缓冲实际上使绘画更慢。 它可以有,稍后绘制在控制的效果。 他们充满之前离开该孔可以一会儿可见,也被看作是闪烁。 你会发现针对效果的反制措施这个答案 。



Answer 2:

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



Answer 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

让我感觉像在问这个问题后,发现该解决方案几年一个完整的白痴。

我有一个小组尝试这样做,但它已被证明采用新的图像时要慢一些。 某处我读,它是更好地使用面板,而不是图片框。 我不知道如果我要添加一些代码来加快速度的面板,虽然。



文章来源: Double buffering with Panel