C# 双缓冲#

C# 双缓冲#,c#,panel,doublebuffered,C#,Panel,Doublebuffered,可能的重复项: 我在面板上绘制位图,在同一面板上使用缩放。缩放时,面板持续闪烁。为什么面板没有DoubleBuffered属性 代码: Graphics g = Graphics.FromHwnd(panel.Handle); if (newImage == true) { g.Clear(SystemColors.Control);

可能的重复项:

我在面板上绘制位图,在同一面板上使用缩放。缩放时,面板持续闪烁。为什么面板没有DoubleBuffered属性

代码:

                Graphics g = Graphics.FromHwnd(panel.Handle);
                if (newImage == true)
                {
                    g.Clear(SystemColors.Control);
                    newImage = false;
                }

                g.DrawImage(bmp, hOffset, vOffset);
                g.Dispose();

你在哪里画位图

如果不在
Paint
事件或
OnPaint
覆盖中,则它是错误的


为了回答您的问题,只有表单具有双缓冲属性IIRC。

我不是100%确定,但您不能在表单/窗口上激活双缓冲吗

还有一个提示,如果你打算使用gui实现很多效果,我会选择WPF而不是winforms

您还可以覆盖OnPaint和OnPaintBackground..

使用此选项

System.Drawing.BufferedGraphics
我是一名游戏开发人员。在游戏中,我们首先在backbuffer中绘制所有对象,然后将其复制或翻转到frontbuffer。您可以使用

System.Drawing.BufferedGraphics
作为backbuffer并将其渲染到图形对象

System.Drawing.Graphics
例如:

        System.Drawing.Graphics g = this.CreateGraphics();
        System.Drawing.BufferedGraphicsContext dc = new BufferedGraphicsContext();
        BufferedGraphics backbuffer = dc.Allocate(g, new Rectangle(new Point(0, 0), g.VisibleClipBounds.Size.ToSize()));
        backbuffer.Graphics.DrawImage(Image.FromFile(@"c:\test.jpg"), new Point(10, 10));
        backbuffer.Render(g);

在构造函数中添加此代码

this.SetStyle(ControlStyles.AllPaintingInWmPaint |ControlStyles.UserPaint |ControlStyles.DoubleBuffer, true);

我使用绘画活动。那我怎么才能避免闪烁呢?如果你自己绘制所有的图形,你可以创建自己的双缓冲,创建一个与面板大小相同的位图,然后在该位图上绘制,然后将位图绘制到面板上..检查此处接受的答案,以获得更好的选项:能否在问题中编写代码。将窗体/窗口设为双缓冲区不会对该窗体/窗口上的控件产生任何影响。我不认为放大一幅图像算作“很多效果”;WinForms很适合这样做。在这里重写
OnPaint
OnPaintBackground
有什么好处?看看我在@leppie post上发表的评论……对另一个答案的评论对改进您自己的答案几乎没有什么作用。在哪个构造函数中?对窗体进行双缓冲不会对该窗体上的面板控件中的闪烁产生任何影响。您必须对
面板
类进行子类化,并将此代码放入自定义类的构造函数中。如果没有更多信息,这不是一个非常有用的答案。我收到一条错误消息,没有足够的存储空间来处理此命令。我已更新我的答案。