C# 中的双缓冲

发布于 2024-11-06 06:39:54 字数 716 浏览 5 评论 0原文

可能的重复:
如何在 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();

Possible Duplicates:
How do I double buffer a Panel in C#?
c# panel for drawing graphics and scrolling

I draw a bitmap on a panel, i use zooming on the same panel. While zooming the panel is continuously flickering. Why do not panel have the DoubleBuffered property?

Code:

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

彻夜缠绵 2024-11-13 06:39:54

在构造函数中添加此代码

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

Add this code inside the constructor

this.SetStyle(ControlStyles.AllPaintingInWmPaint |ControlStyles.UserPaint |ControlStyles.DoubleBuffer, true);
柠檬色的秋千 2024-11-13 06:39:54

用这个。

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

use this.

System.Drawing.BufferedGraphics

I am a game developer.In games we first draw all objects in a backbuffer and then copy or flip it to frontbuffer.You can use

System.Drawing.BufferedGraphics

as backbuffer and render it to graphics object.

System.Drawing.Graphics

for example:

        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);
单调的奢华 2024-11-13 06:39:54

你在哪里画位图?

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

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

Where are you painting the bitmap?

If not in the Paint event or OnPaint override, then it is wrong.

To answer your question, only forms have the DoubleBuffered property, IIRC.

_蜘蛛 2024-11-13 06:39:54

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

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

您还可以覆盖 OnPaint 和 OnPaintBackground ..

Im not 100% sure but cant you activate DoubleBuffered on the form/window instead?

And one tip if your going to use gui with alot of effects i would go with WPF instead of winforms..

You can also override OnPaint and OnPaintBackground..

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文