在c#中双缓冲

时间:2011-05-11 11:42:24

标签: c# panel doublebuffered

  

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

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

代码:

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

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

4 个答案:

答案 0 :(得分:1)

使用它。

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

答案 1 :(得分:1)

在构造函数

中添加此代码
this.SetStyle(ControlStyles.AllPaintingInWmPaint |ControlStyles.UserPaint |ControlStyles.DoubleBuffer, true);

答案 2 :(得分:0)

你在哪里画位图?

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

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

答案 3 :(得分:-1)

我不是100%肯定,但你不能在窗体/窗口上激活DoubleBuffered吗?

如果你要使用gui和很多效果,我会选择WPF而不是winforms ..

您还可以覆盖OnPaint和OnPaintBackground ..