2016-08-26 26 views
0

我在運行時在窗體上放置了一個usercontrol。 FormClosing後遇到UserControl_MouseLeave。UserControl MouseLeave在FormClosing後發生

我想知道這是否應該在正常情況下發生。爲了測試這種情況是否會正常發生(而不僅僅是在我的巨大項目中),我使用一個微小的用戶控件(只有一定的背景顏色)設置了一個測試項目,並且我還沒有能夠獲得收到Form_Closing事件後UserControl_MouseLeave事件 。 這讓我想知道,如果我的其他usercontrol只需要很長時間卸載,因此不會馬上消失,從而在FormClosing事件之後仍然保持活躍狀態​​。

不幸的是我沒有找到有關事件發生的時間的任何信息。

有誰知道這種行爲是否正常?

+0

這是完全正常的,只是想一想。在FormClosing事件中,該窗口實際上還沒有關閉。它可以被取消。所以當然鼠標並沒有真正離開你的用戶控件。直到後來才發生,當窗口實際上關閉時。 FormClosing之前或之後是否觸發取決於您關閉窗口的方式。當你使用鼠標的時候,它當然會首先觸發,然後移動它。當你說,按Alt + F4然後它在之後發射。 –

回答

2

當FormClosing事件被觸發時沒有任何東西被銷燬,所以你關於處置花費很長時間的觀察可能實際上是正確的。

當窗體關閉時,內部調用WM_CLOSE方法。這裏是發生了什麼的流程圖:

Form closing flowchart

從MSDN文章Closing the Window

採取WM_CLOSE,該FormClosing事件在MDI兒童以及所有擁有的形式提出。即使在此之後,仍有可能取消該操作。

如果我們繼續關閉,窗口將從屏幕上移除(但它仍然存在)。只有在此之後,WM_DESTROY消息纔會發送到窗體本身和子窗口。 MSDN states that

在處理消息的過程中,可以假定所有的子窗口仍然存在。

如果您有一個非常複雜的應用程序需要較長的時間來處理,那麼在FormClosing事件之後仍然會觸發事件,即使此時表單不可見也是如此。

這也有可能是你的代碼有問題,但沒有看到它,這是我認爲是行爲的原因。

編輯:您可以通過查看Reference Source來了解窗體如何處理所有內容。

+0

我希望我可以添加更多upvotes!謝謝! – tmighty