2012-05-08 66 views
0

我在C#中编写了一个MDI应用程序,它包含通过DLL引用的两个子窗体(独立项目添加到引用)。 一个子窗体(称之为form1)正在使用计时器基于图形对象执行动画。这个项目(子form1)工作正常,直到其他子窗体(称为form2)被加载。会发生什么情况是第一个窗体(form1)上的动画会停止,但是当我关闭第二个窗体(form2)时,动画仍然没有问题。两个MDI子窗体相互干扰

我在窗口2使用此代码:

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

那么,第二种形式有什么特别之处?我们所知道的只是一条鱼。如果你没有线索,则以第二种形式注释大量的代码。 –

+0

这也是一些动画,但没有计时器。什么form2(鱼)做的是当你点击鼠标,鱼移动到点击区域 – falcon2303

+0

那么,你几乎肯定需要使用计时器来动画鱼。如果循环,则第一个窗体中的计时器停止工作。 –

回答

1

定时器保持在由由Windows下发的通知去时的时间间隔已过期。然而,这是一个非常低的优先级通知,你只有在没有其他工作需要完成时才能得到它。

您现在应该可以看到Paint事件处理程序的问题。首先,你可以防止任何的工作不断地完成。然后你确保有总是工作要通过调用Invalidate()来完成。所以Windows生成一个新的绘画事件并且永远不会到达可以传递定时器事件的状态。

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

+0

中加速,但是当我点击并移动窗体的其他窗体(窗体2)时会出现新问题,动画在(form1)中加速,反之亦然 – falcon2303

+0

我相信,当你修复Paint事件处理程序时,这也得到了解决。如果情况并非如此,请提出一个新问题。 –

+0

好的,谢谢你的快速和有用的回复 – falcon2303