我正在e.Graphics.DrawImage
事件中使用Form_Paint()
绘制图像。我使用Timer
刷新表单。问题是动画闪烁。更新e
似乎需要很长时间。我在表单中有2 PictureBox
。
想法?
更新:
public Bitmap Paint(int state, Graphics g)
{
this.state = state;
Bitmap temp;
Graphics tempGraphics;
temp = new Bitmap(45, 47, g);
tempGraphics = Graphics.FromImage(temp);
switch (state)
{
case 0:
tempGraphics.DrawImageUnscaled(img, x, y);
break;
case 1:
tempGraphics.DrawImageUnscaled(img, x, y - 42);
break;
}
}
这会在将精灵添加到表单之前准备精灵。
答案 0 :(得分:1)
通常管理它的方法是将更新绘制到内存中的位图。然后将位图绘制到屏幕上。进程较慢(因为还有更多工作要做),但它看起来更快,因为没有闪烁。
但是,许多控件实际上会自动为您执行此操作。查看double buffering techniques。
答案 1 :(得分:0)
在大多数情况下,它是由于没有正确设置样式而导致的,因此首先绘制背景(通常为白色),然后绘制图像。
如果只是简单地绘制,那么也可以搜索/读取双缓冲。
答案 2 :(得分:0)
我通过避免在表单上做任何动画来解决问题。如果您向窗体添加控件然后为父窗体设置动画,则会覆盖UI线程。最好的解决方案是将所有动画保留在图片框中。
所以:你要么直接用g.DrawImage()
制作动画,要么坚持使用PictureBox
。