2009-02-13 94 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。如果你使用不同的签名来重载它,你甚至可能打电话显示。