2009-02-13 22 views
5

Supongamos que por cada Formulario en una aplicación WinForms, desea cambiar el cursor al WaitCursor. La manera obvia de hacerlo sería añadir el código a todos los lugares donde se crea una instancia de un formulario/muestra:VB.NET 2005 - Controlador de eventos "global"?

Try 
    Me.Cursor = Cursors.WaitCursor 

    Dim f As New frmMyForm 
    f.Show() 

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

Sin embargo, me preguntaba si hay una manera de decirle a su aplicación, "siempre que una forma de carga incendios de eventos, mostrar un WaitCursor. Cuando se completa el evento de formulario Mostrado, establecer el cursor de nuevo a Predeterminado ". De esta forma, el código Me.Cursor podría estar solo en un lugar y no disperso por la aplicación, y no debe olvidarse de ponerlo en cada instancia de formulario.

Supongo que podría crear una subclase de la clase de formulario regular y agregar la configuración del cursor en un evento anulado, pero creo que pierde la capacidad del diseñador visual al subclasificar el objeto de formulario.

+0

Espero que sepas que la parte de Captura es completamente inútil? (Y debería dejarse fuera) –

+0

Tengo otro código en mis bloques de captura. Este es un ejemplo simplificado. – HardCode

Respuesta

2

Para responder a su pregunta, no hay eventos globales de .Net para lograr lo que desea. No hay ninguna solución pura de .net para esto. Podrías echarle un vistazo a la Programación Orientada a Aspectos y las Preocupaciones Transversales: puede haber una solución de AOP (esto te ayudará a empezar y luego volver a publicar aquí para más detalles).

Sin embargo, lo que sigue es más una idea que una solución completa sobre cómo puede lograr esto usando la mensajería win32.

  1. Necesita determinar qué mensajes de win32 corresponden al evento de carga y si hay un mensaje de win32 que siempre ocurre después del evento de carga. Un candidato para el evento de carga podría ser WM_SHOWWINDOW pero no estoy seguro.
  2. Escribir una clase de filtro de mensaje (es decir, implementar IMessageFilter).
  3. En el método PreMessageFilter de la clase de filtro de mensajes, compruebe el tipo de mensaje y si se trata de un mensaje WM_SHOWWINDOW (o lo que sea) con los parámetros correctos, entonces puede establecer/restablecer el cursor (usando Cursor.Current = Cursors.WaitCursor - de nuevo necesita para probar esto)
+0

Suena como una idea. ¡Gracias! Voy a ver esto. – HardCode

3

Subclassing es una opción, no se pierde el diseñador, siempre y cuando no se configure la superclase como mustinherit, realmente no le gusta eso.

1

Otra opción que no implicaría subclases es agregar un método de extensión al tipo de formulario. Luego puede llamar a su método de extensión (algo así como ShowAndWait()) en lugar de mostrar. Incluso podría estar a punto de llamar si se muestra si se sobrecarga con una firma diferente.

+0

Podría confundir mi terminología, pero ¿no son nuevos los métodos de extensión en VS.NET 2008? Estoy usando 2005. Si no, entonces probaré esto. – HardCode

+0

Estás en lo correcto. Son nuevos en 2008 –

Cuestiones relacionadas