我正在尝试在Win Forms中制作动画,我尝试了一种不同的方法,而不是在timer_elapsed处理程序中调用Invalidate(),然后在OnPaintHandler中执行操作。
我只是直接在pictureBox上绘制图像,然后当timer_ticks,我调用Invalidate,然后我手动重绘更新位置上的图像。
static void tmrMoving_Elapsed(object sender, EventArgs e, Train t)
{
MainForm.playBox.Invalidate();
g.DrawImage(t.components[i], new Rectangle(
new Point(t.nextVagoonPositionX * 20, t.nextVagoonPositionY * 20),
new Size(20, 20)));
t.nextVagoonPositionX += 1;
t.nextPositionX = -1;
}
我有一个问题,当计时器滴答时,有时会得到所需的图像,有时不会,有30%的机会不能绘制(我有1秒的计时器间隔,所以我可以看到它),即使对象是移动或只是在同一个地方。
我尝试过的事情:
1.在Invalidate()中设置区域args - >图像在旧图像旁边被绘制了很多次(因此,由于旧图像保留在它们的位置,因此不能在所需位置重新绘制)
2.在invalidate->之后调用Update()或Refresh()或两者。没有显示任何图像
3.将Update()或Refresh()或两者与Invalidate(rectangulous region)结合 - >没有图像显示
4.设置DoubleBuffering为true - >没效果
5.摆弄this.SetStyle(ControlStyles.UserPaint,true); - >没有效果(甚至不确定它是做什么的。)