0

我正在用 C# 编写一个 MDI 应用程序,其中包含两个通过 DLL 引用的子窗体(添加到引用的独立项目)。一个子窗体(称为 form1)正在使用计时器执行基于图形对象的动画。在加载另一个子表单(称为 form2)之前,此项目(子 form1)工作正常。发生的情况是第一个表单(form1)上的动画停止,但是当我关闭第二个子表单(form2)时,动画继续没有问题。

我在 form2 中使用此代码:

private void FlyingBeeForm_Paint(object sender, PaintEventArgs e) {
    Graphics g = e.Graphics; 
    DrawImages(g); 
    System.Threading.Thread.Sleep(50); 
    this.Invalidate(); 
}
4

1 回答 1

1

当时间间隔到期时,计时器会通过 Windows 传递的通知保持运行。然而,这是一个非常低优先级的通知,只有在不需要做其他工作时才会收到它。

您现在应该看到 Paint 事件处理程序的问题。一方面,你通过不断睡觉来阻止任何工作完成。然后通过调用 Invalidate() 确保有工作要做。因此,Windows 会生成一个新的绘制事件,并且永远不会到达可以传递计时器事件的状态。

您必须删除 Sleep 和 Invalidate 调用。并改用 50 毫秒计时器。只需在其 Tick 事件处理程序中调用 Invalidate()。

于 2012-05-08T15:10:58.480 回答