【问题标题】:double buffered in c# [duplicate]c#中的双缓冲[重复]
【发布时间】:2011-08-23 05:56:02
【问题描述】:

可能的重复:
How do I double buffer a Panel in C#?
c# panel for drawing graphics and scrolling

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

代码:

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

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

【问题讨论】:

标签: c# panel doublebuffered


【解决方案1】:

在构造函数中添加这段代码

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

【讨论】:

  • which 构造函数的内部?双缓冲表单不会对该表单上的面板控件中的闪烁产生任何影响。您必须继承 Panel 类并将此代码放在自定义类的构造函数中。缺少更多信息,这不是一个很有帮助的答案。
【解决方案2】:

使用这个。

System.Drawing.BufferedGraphics

我是一名游戏开发者。在游戏中我们首先将所有对象绘制在后缓冲区中,然后将其复制或翻转到前缓冲区。您可以使用

System.Drawing.BufferedGraphics

作为后备缓冲区并将其渲染到图形对象。

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);

【讨论】:

  • 我收到一条错误消息没有足够的存储空间来处理此命令
  • 我已经更新了我的答案。
【解决方案3】:

你在哪里绘制位图?

如果不在Paint 事件或OnPaint 覆盖中,则为错误。

要回答您的问题,只有表单具有 DoubleBuffered 属性 IIRC。

【讨论】:

  • 我使用 Paint 事件。 :)。那么如何避免闪烁呢?
  • 如果您自己完成所有绘图,您可以创建自己的双缓冲,创建与面板大小相同的位图并在该位图上绘制,然后将位图绘制到面板..
【解决方案4】:

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

还有一个提示,如果您要使用具有很多效果的 gui,我会使用 WPF 而不是 winforms..

您还可以覆盖 OnPaint 和 OnPaintBackground..

【讨论】:

  • 对窗体/窗口进行双缓冲不会对该窗体/窗口上的控件执行任何操作。我不认为放大图像算作“很多效果”。 WinForms 正好适合这个。在这里覆盖OnPaintOnPaintBackground 有什么好处?
  • 看看我在@leppie post 上发表的评论...
  • 对另一个答案的评论对改进您的自己的答案几乎没有帮助。
猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 2011-10-16
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2011-12-08
相关资源
最近更新 更多