2009-02-13 128 views
5

假設對於WinForms應用程序中的每個窗體,您想要將光標更改爲WaitCursor。最明顯的方式做到這一點是將代碼添加到每一個地方的形式來實例化的地方/圖所示:VB.NET 2005 - 「全局」事件處理程序?

Try 
    Me.Cursor = Cursors.WaitCursor 

    Dim f As New frmMyForm 
    f.Show() 

Catch ex As Exception 
    Throw 
Finally 
    Me.Cursor = Cursors.Default 
End Try 

不過,我想知道是否有辦法告訴你的應用程序,「無論是哪種形式的負載事件觸發,顯示一個WaitCursor。當表單事件顯示完成時,將光標移回默認值。「這樣,Me.Cursor代碼就可以只在一個地方,而不是散佈在整個應用程序中 - 並且不會忘記將它放入每個表單實例中。

我想你可以繼承常規Form類並在重寫的事件中添加遊標設置,但是我相信當你繼承Form對象時,你失去了可視化設計器的能力。

+0

我希望你知道Catch部分是完全沒有意義的? (並且應該被忽略) – 2009-02-14 00:52:41

+0

我的Catch塊中有其他代碼。這是一個簡單的例子。 – HardCode 2009-02-14 04:49:27

回答

2

要回答你的問題 - 沒有全球.Net事件來實現你想要的。沒有任何純淨的.net解決方案。你可以看看面向方面編程和橫切關注點 - 可能會有一個AOP解決方案(一些谷歌搜索會讓你開始,然後回到這裏的細節)。

然而,接下來的更多的是一個想法,而不是一個完整的解決方案,你可以如何使用win32消息傳遞實現這一點。

  1. 您需要計算出哪些win32消息對應於Load事件,以及是否存在始終發生在加載事件之後的win32消息。負載事件的一名候選人可能是WM_SHOWWINDOW,但我不確定。
  2. 編寫一個消息過濾器類(即執行IMessageFilter)。
  3. 在消息過濾器類的PreMessageFilter方法中檢查消息類型,如果它是具有正確參數的WM_SHOWWINDOW(或其他)消息,則可以設置/重置遊標(使用Cursor.Current = Cursors.WaitCursor - 再次需要來測試這個)
+0

聽起來像一個想法。謝謝!我會研究這個。 – HardCode 2009-02-13 15:58:41

3

子類化是一個選項,只要你沒有將超類設置爲mustinherit,你就不會鬆動設計器,它並不真的那樣。

1

不涉及子類化的另一種選擇是向Form類型添加擴展方法。然後你可以調用你的擴展方法(像ShowAndWait())而不是show。如果你使用不同的簽名來重載它,你甚至可能打電話顯示。