C#,WinForms中的双缓冲区?

Rob*_*Rob 2 c# doublebuffered

        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);
                }
            }
    }
Run Code Online (Sandbox Code Playgroud)

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

Ed *_* S. 6

正如Neil指出的那样,您不需要(也不应该)在循环的每次迭代中创建一个新的Graphics对象.这些是相对昂贵的资源,不应该无法创建.

此外,您不应该在按钮内部绘制如此通过调用CreateGraphics来单击处理程序.它可能会导致问题,最明显的是当调用paint处理程序时(即每次窗口收到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 ) );
    }
}
Run Code Online (Sandbox Code Playgroud)