两个 MDI 子窗体相互干扰

本文关键字:干扰 窗体 MDI 两个 | 更新日期: 2023-09-27 18:33:27

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

我在 form2 中使用此代码:

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

两个 MDI 子窗体相互干扰

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

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

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