2012-05-08 128 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