C# 带面板的双缓冲

C# 带面板的双缓冲,c#,winforms,panel,system.drawing,double-buffering,C#,Winforms,Panel,System.drawing,Double Buffering,通过将“AllPaintingWmPaint”、“UserPaint”和“DoubleBuffer”控件样式的值设置为“true”,可以对整个表单进行双缓冲处理(this.SetStyle(ControlStyles.AllPaintingWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer,true)) 但是这不能发生在System.Windows.Forms.Panel上,因为类不允许我这样做。我找到了一个解决方案:。我

通过将“AllPaintingWmPaint”、“UserPaint”和“DoubleBuffer”控件样式的值设置为“true”,可以对整个表单进行双缓冲处理(
this.SetStyle(ControlStyles.AllPaintingWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer,true)

但是这不能发生在System.Windows.Forms.Panel上,因为类不允许我这样做。我找到了一个解决方案:。我也试过这个:。它很滞后,即使是在一个小图形上使用,我也有一些自定义资源,我在表单和其他东西中使用这些资源,因此我不会将整个表单变成一个图形。第二个似乎会引起问题。还有其他方法吗


我这样问是因为我不想在调整窗体大小时面板上的图形一直闪烁。如果有一种不需要双缓冲就可以消除闪烁的方法,我很乐意知道。

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

using System;
using System.Windows.Forms;

class MyPanel : Panel {
    public MyPanel() {
        this.DoubleBuffered = true;
        this.ResizeRedraw = true;
    }
}
ResizeRedraw分配抑制容器控件的绘制优化。如果你在面板上画画,你需要这个。如果没有它,当您调整面板大小时,绘画会被弄脏


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

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

我早就该发布解决方案了

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

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
在提出这个问题多年后,我发现了这个解决方案,这让我觉得自己像个十足的白痴


我已经用面板试过了,但在应用新图像时,速度会慢一些。我在某个地方读到,最好用面板而不是图片盒。不过,我不知道是否需要在代码中添加一些东西来加快面板的运行速度。

我认为这取决于您要做什么。您正在尝试执行数据或动画的刷新吗?你想做一个游戏吗?我记得使用system.drawing很难消除闪烁,即使使用双缓冲(有时帧速率很慢,即使使用双缓冲,看起来也像闪烁),这是一个在WinForms窗口中玩的游戏。该图形绘制在面板上。当用户单击面板时,图形正在更改。但是当有滚动和调整大小的过程时,也会有闪烁。你可以在这里找到一个解决方案,它对我有用。[解决方案][1][1]:我可以尝试去掉一些控件,但它们不会太多。。。我将尝试创建一个新的Panel类,并“解锁”System.Windows.Forms.Panel的一些功能。但是谢谢你的链接。这是一个方便的教程。汉斯,你如何将旧面板与新面板交换?我写了这个类,现在我如何将它连接到我现有的
panel1
,使它获得上述属性?从表单中删除panel1并将它放回原处。您可以将其重命名为“panel1”以保持现有代码正常工作。我已经尝试过了,但在“panel1”之间出现了歧义错误