gpt4 book ai didi

C#,WinForms 中的双缓冲区?

转载 作者:行者123 更新时间:2023-11-30 19:20:50 25 4
gpt4 key购买 nike

        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 在按钮单击处理程序内部进行绘制。它可能会导致问题,最明显的是当调用绘制处理程序时您的绘图被“撤消”(即,每次窗口收到 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 ) );
}
}

关于C#,WinForms 中的双缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5095221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com