【问题标题】:Two MDI child forms interfering with each other相互干扰的两个 MDI 子窗体
【发布时间】:2012-05-08 14:32:24
【问题描述】:

我正在用 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(); 
}

【问题讨论】:

  • 那么,第二种形式有什么特别之处呢?我们只知道它是一条鱼。如果您不知道,请注释掉第二种形式的代码块。
  • 这也是一些动画,但没有计时器。 form2(fish) 的作用是当您单击鼠标时,鱼会移动到单击的区域
  • 好吧,您几乎肯定需要使用计时器来为鱼设置动画。如果您循环,则第一种形式的计时器将停止工作。
  • 两个项目(form1 和 form2)都基于绘制事件(当控件需要重新绘制时发生)
  • 邮编,不说了。您现在拥有的 sn-p 无法诊断问题。我们不需要看鱼是如何游动的,只需要看是什么让它们继续前进。

标签: c# animation mdichild


【解决方案1】:

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

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

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

【讨论】:

  • 但是当我点击并移动另一个窗体(form2)的窗口时出现新问题,然后动画在(form1)中加速,反之亦然
  • 我相信,当您修复 Paint 事件处理程序时,这个问题也会得到解决。如果不是这样,请开始一个新问题。
猜你喜欢
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 2013-05-27
  • 1970-01-01
  • 2020-05-31
  • 2012-12-03
相关资源
最近更新 更多