C#,WinForms 中的双缓冲区?

2024-03-20

        private void button3_Click(object sender, EventArgs e)
    {

        this.DoubleBuffered = true;

            for (int i = 0; i < 350; i++)
            {
                using (Graphics g = this.CreateGraphics() )
                {
                    g.Clear(Color.CadetBlue);
                    g.DrawImage(Properties.Resources._256, 100, 100, i-150, i-150);
                }
            }
    }

然而,尽管我将 DoubleBuffered 设置为 true,图像仍然闪烁。有什么想法我做错了什么吗? 谢谢!


正如 Neil 指出的,您不需要(也不应该)在循环的每次迭代中创建新的 Graphics 对象。这些是相对昂贵的资源,不应该随意创建。

另外,您不应该通过调用 CreateGraphics 在按钮 Click 处理程序内部进行这样的绘制。它可能会导致问题,最明显的是,当调用绘制处理程序时(即每次窗口收到 WM_PAINT 消息并刷新时),您的绘图将被“撤消”。您应该通过重写 OnPaint 来完成所有绘画,并在需要更新表单时简单地调用 Invalidate() 。

至于闪烁,将 DoubleBuffered 设置为 true 通常会解决它,但滚动您自己的双缓冲是微不足道的。试一试。还要意识到,像这样的循环绘制可能不是您想要做的。如果您想每隔一定时间间隔更新一次,请使用计时器。您的代码的执行速度与循环的执行速度一样快,这通常是不可取的。

private void someTimer_Tick( ... )
{
    Invalidate();
}
protected override void OnPaint( PaintEventArgs e )
{
    using( var tempBmp = new Bitmap( ... ) )
    using( var g = Graphics.FromImage( tempBmp ) )
    {
        // draw to tempBmp
        e.Graphics.DrawImage( tempBmp, new Point( 0, 0 ) );
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#,WinForms 中的双缓冲区? 的相关文章

随机推荐