-1

可能的重复:
如何在 C# 中对面板进行双重缓冲?
用于绘制图形和滚动的 c# 面板

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

代码:

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

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

4 回答 4

1

在构造函数中添加此代码

this.SetStyle(ControlStyles.AllPaintingInWmPaint |ControlStyles.UserPaint |ControlStyles.DoubleBuffer, true);
于 2011-05-11T11:51:30.583 回答
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);
于 2011-05-11T11:47:50.750 回答
0

你在哪里画位图?

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

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

于 2011-05-11T11:45:21.900 回答
-2

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

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

您还可以覆盖 OnPaint 和 OnPaintBackground..

于 2011-05-11T11:47:28.983 回答