我正在尝试用Win Forms制作动画,并且我尝试了一种不同于在timer_elapsed处理程序中调用失效(),然后在OnPaintHandler中执行操作的方法。
我只需在pictureBox上直接绘制一个图像,然后当timer_ticks调用失效时,然后在更新的位置手动重新绘制图像。
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.在image () args ->中设置一个区域--图像多次绘制在旧图像的旁边(因此,由于旧图像保留在它们的位置,所以它没有在所需的位置重新绘制)
2.在失效后调用Update()或Refresh()或两者->没有显示任何图像
3.将Update()或Refresh()或两者与无效(矩形区域)组合在一起,->从来没有显示过任何图像
4.设置DoubleBuffering真->无效
5.摆弄this.SetStyle(ControlStyles.UserPaint,真);->无效果(甚至不确定它做了什么)
发布于 2015-08-15 14:51:24
不应该直接在OnPaint处理程序之外绘制UI控件。在“低级”WinAPI中,您只会在WM_PAINT上的屏幕上绘制,这就是引发OnPaint事件的原因。
将绘图代码(g.DrawImage(...))从计时器处理程序移到OnPaint处理程序中。
https://stackoverflow.com/questions/32025817
复制相似问题