Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不涂油漆就失效_C#_Winforms_Animation_Graphics_Invalidation - Fatal编程技术网

C# 不涂油漆就失效

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

我正在尝试在Win窗体中制作动画,我尝试了一种不同的方法,而不是在timer\u处理程序中调用Invalidate(),然后在OnPaintHandler中执行操作

我只是直接在一个pictureBox上画一个图像,然后当计时器滴答作响时,我调用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的终极示例,您实际上可以看到它,无需等待一周。你必须停止做错事。