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(使用前将#替换为@)