Gerardo Contijoch

Experiencias del día a día trabajando con .NET – ASP.NET, C#, ASP.NET MVC y demas…

Archive for 14 septiembre 2009

Suspender el dibujado de un control o formulario

Posted by Gerardo Contijoch en septiembre 14, 2009

Hay ocasiones en que nuestros Forms terminan recargados de controles, los cuales cambian de estado o contenido todos a la vez. Si la cantidad de controles es mucha y el contenido de los mismo es modificado varias veces en un breve intervalo de tiempo o simplemente el redibujado de los mismos es muy lento (es decir, el usuario nota como se va llenando cargando el contenido del Form progresivamente), podemos optar por suspender el redibujado del form en su totalidad hasta que los controles estén listos para ser dibujados.

Muy relacionado con mi último post, les dejo el link al código de una clase que se encarga de suspender y reanudar el redibujado de un control (o form en su totalidad si lo deseamos). La técnica se basa en el envío de mensajes al control o ventana en cuestión.

¡Nos vemos en el próximo post!

Publicado originalmente en https://gerardocontijoch.wordpress.com.

Posted in .Net 2.0, C# | Etiquetado: , | 4 Comments »

Encontrar el valor de un Window Message

Posted by Gerardo Contijoch en septiembre 12, 2009

De vez en cuando, si trabajamos con WinForms, nos puede surgir la necesidad de manejar un evento a muy bajo nivel y para hacerlo tenemos que interceptar los famosos Window Messages, o mensajes de ventana. Estos mensajes son el mecanismo que utiliza Windows para comunicarse con una aplicación. Cuando apretamos una tecla y nuestra aplicación responde, parece que es nuestra aplicación la que ‘atrapó’ el teclazo, pero en realidad es el Sistema Operativo (SO) el que lo atrapó (debido a que el SO es quien controla el puerto donde esta conectado el teclado) y este le envía un mensaje a nuestra aplicación para que responda al mismo, normalmente imprimiendo el caracter representado por la tecla presionada. Aunque no lo parezca, el SO es quien tiene control de todo lo que sucede y cuando nuestra aplicación responde a distintos inputs, es en realidad el SO el que le ordena que haga una cosa u otra.

Si tenemos un Form y el SO determina que es necesario que sea redibujado (porque cambio su contenido por ejemplo), entonces se envía un mensaje conocido como WM_PAINT (en .NET veremos que esto dispara el evento Paint), en cambio si presionamos la tecla ‘Q’ en el teclado, entonces el mensaje recibido por nuestra aplicación es WM_KEYDOWN (también tenemos el evento KeyDown en .NET, el cual es lanzado cuando se recibe un mensaje de este tipo). Cabe aclarar que el nombre de los mensajes es solo una ayuda para nosotros los humanos, ya que los mensajes en realidad no son más que un valor entero, y estos nombres son los nombres de las constantes asociadas a los mismos.

Para interceptar estos mensajes lo que se suele hacer comúnmente es sobrescribir el método WndProc definido en la clase Control de la siguiente manera:

   1: ...
   2: private const int WM_PAINT = 15;
   3:
   4: protected override void WndProc(ref Message m) {
   5:
   6:     if (m.Msg == WM_PAINT) {
   7:         // Atrapamos el mensaje...
   8:     } else{
   9:         // Ignoramos el mensaje y dejamos que siga su curso
  10:         base.WndProc(ref m);
  11:     }
  12:
  13: }
  14: ...

El método WndProc es el que se encarga de procesar todos los mensajes que recibe un Form y es por eso que ese es el punto indicado para atraparlos.

Ahora el problema esta en conocer el valor de los mensajes, ya que muchas veces uno sabe que mensaje procesar, pero no sabe cual es su valor. Estos valores están definidos en la clase System.Windows.Forms.NativeMethods y System.Design.NativeMethods, pero lamentablemente estas clases son internas y no tenemos acceso a ellas, por lo que vamos a tener que usar .NET Reflector para ver su contenido.

La info de este post fue sacada de aquí.

¡Nos vemos en el próximo post!

Publicado originalmente en https://gerardocontijoch.wordpress.com.

Posted in .Net 2.0, C# | Etiquetado: , , | Leave a Comment »

¡Este blog no esta muerto! (sólo un poco dormido)

Posted by Gerardo Contijoch en septiembre 12, 2009

Si alguien se estaba preguntando si este era uno más de esos blogs que nacen para morir al poco tiempo, se equivocó. El blog no esta muerto, sólo un poco dormido. La razón principal de mi ausencia es que estuve los últimos meses muy ocupado (ocupadísimo sería un término mas exacto) con proyectos cuyo desarrollo lamentablemente no entran dentro de la idea que tengo de este blog. Como expliqué en mi primer post, mi intensión es centrarme en tecnologías .NET y nada más. Entre estos proyectos que me mantuvieron alejado de la blogosfera se encuentra un site hecho con Google Web Tookit (sólo recomendable para aquellos que quieran renegar mucho y obtener como resultado un site con un aire a producto de Google) y un proyecto desarrollado parte con Adobe Flex (realmente disfrute desarrollando en ActionScript 3.0, muy linda experiencia) y parte con un framework/entorno de desarrollo llamado Unity3d (importando librerías escritas con Mono).

Hoy regresé, aunque no se si por mucho tiempo ya que en realidad sigo bastante ocupado.

¡Nos vemos en el próximo post!

Publicado originalmente en https://gerardocontijoch.wordpress.com.

Posted in Personal | Etiquetado: | 1 Comment »