C# 不涂油漆就失效
我正在尝试在Win窗体中制作动画,我尝试了一种不同的方法,而不是在timer\u处理程序中调用Invalidate(),然后在OnPaintHandler中执行操作 我只是直接在一个pictureBox上画一个图像,然后当计时器滴答作响时,我调用Invalidate,然后我在更新的位置手动重画图像C# 不涂油漆就失效,c#,winforms,animation,graphics,invalidation,C#,Winforms,Animation,Graphics,Invalidation,我正在尝试在Win窗体中制作动画,我尝试了一种不同的方法,而不是在timer\u处理程序中调用Invalidate(),然后在OnPaintHandler中执行操作 我只是直接在一个pictureBox上画一个图像,然后当计时器滴答作响时,我调用Invalidate,然后我在更新的位置手动重画图像 static void tmrMoving_Elapsed(object sender, EventArgs e, Train t) { MainForm.playBox.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.在“无效->无图像显示”之后调用Update()或Refresh()或两者
3.将Update()或Refresh()或两者与Invalidate(矩形区域)->从未显示任何图像
4.设置双缓冲为真->无效果
5.摆弄这个.SetStyle(ControlStyles.UserPaint,true);->没有效果(顺便说一句,甚至不确定它是做什么的)。您不应该在OnPaint处理程序之外直接绘制UI控件。在“低级”WinAPI中,您只需要在WM_PAINT上绘制屏幕,这会引发OnPaint事件
将您的绘图代码(
g.DrawImage(…)
)从计时器处理程序中移出,放入OnPaint
处理程序。谢谢您提供的信息,我可以问一下处理OnPaint时谁是发件人吗?是那个计时器吗?不,最好是windows系统本身。出于所有目的,这种情况都发生在“幕后”。发送者是PictureBox,原因是系统或您的代码。它确实被绘制出来,只是不会持续很长时间。使用playBox的普通OnPaintBackground和OnPaint方法进行过度渲染。你是否能看到一切取决于你眨眼的频率和UI线程的响应速度。这是线程竞赛bug的终极示例,您实际上可以看到它,无需等待一周。你必须停止做错事。