Mostrando entradas con la etiqueta Conceptos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Conceptos. Mostrar todas las entradas

WinApi: Mensajes: WM_PAINT


El mensaje WM_PAINT es quizás el más difícil de comprender en su totalidad. Y esto es un problema ya que de él depende que nuestros programas funcionen de una manera fluida y elegante. Uno de las consecuencias más comunes de no procesar correctamente este mensaje es el parpadeo que producen los controles de un formulario o ventana cuando esta se está redimensionando con el ratón. Otro efecto también común es ver como zonas de las ventanas de nuestros programas no se redibujan correctamente cuando son tapadas por otras ventanas.

¿ Por qué nuestra aplicación recibe mensajes WM_PAINT ?

Básicamente porque la filosofía de programación para Windows radica en el concepto de "No me llame, ya le llamare yo." o lo que es lo mismo... Que en la mayoría de las ocasiones será Windows quien le indique a nuestro programa que debe dibujar el contenido gráfico de sus ventanas. Obviamente también podemos forzar nosotros mismo el dibujado cuando sea necesario pero lo más habitual sea que el mismo Windows nos indique que debemos actualizar nuestra pantalla bien porque otra se haya colocado encima o por que se activado el salvapantallas o porque hemos maximizado o minimizado nuestra aplicación. Sea como sea tenga por seguro que Windows tarde o temprano nos va a mandar el mensaje WM_PAINT a nuestro programa.

¿ Dónde recibe nuestra aplicación los mensajes WM_PAINT ?

Los mensajes WM_PAINT pueden llegar a nuestra aplicación solamente a tres sitios. O llegan a la cola de mensajes principal del programa, o la cola de mensaje de un thread que haya creado una ventana o directamente al procedimiento de ventana de una ventana. Pero vengan como vengan en realidad solo hay un sitio donde deberemos ocuparnos de ellos, que es en el procedimiento de ventana.

¿ Cuándo recibe nuestra aplicación mensajes WM_PAINT ?


  • Cuando Windows necesite redibujar nuestras ventanas.
  • Cuando dentro de nuestros programas usemos las funciones del Api de Windows:

    • UpdateWindow
    • RedrawWindow


WinApi: Conceptos: Crear ventanas

La programación con el Api de Windows es un trabajo casi por completo centrado en las ventanas.

Por eso es muy importante saber que es y que no es una ventana desde el punto de vista de Windows que inicialmente no tiene que coincidir con el punto de vista del programador y explicaré por que.

Aunque en principio pudiera parecer que las ventanas en Windows son aquellas que representan a los programas como por ejemplo el Notepad, la Calculadora , etc lo cierto es que las ventanas Windows son en realidad casi todo lo que que vemos en la pantalla y que normalmente tiene una apariencia rectangular.

Me explico, y tomando como ejemplo la calculadora de Windows citaremos las ventanas que la forman:

* La ventana principal que incluye el titulo junto con los botones de minimizar y cerrar el programa.
* La zona donde se muestra el resultado de las operaciones también es una ventana windows.
* Y por ultimo cada uno de los botones que aparecen en la superficie de la calculadora también son ventanas.

Normalmente a las ventanas principales de los programas se le llaman ventanas superpuestas y a las ventanas que se encuentran en su interior se les llaman ventanas hija o simplemente controles.

La prueba mas clara de que tanto las ventanas principales de los programas como las ventanas hijas o controles son para Windows la misma cosa es que ambas se crean con la misma función del WinApi... CreateWindow().

WinApi: Conceptos: Procedimientos de ventana

Un procedimiento de ventana es una función que procesa todos los mensajes destinados a una ventana.

Cada ventana tiene asociado un procedimiento de ventana.

Todas las ventanas de una misma clase comparten el mismo procedimiento de ventana.

El procedimiento de ventana se define en la función de registro de una clase. ( RegisterClass )

Como el procedimiento de ventana es común a todas las ventanas hay que tener cuidado con los recursos que puedan estar compartidos por ellas dentro del procedimiento de ventana.

Un procedimiento es una función que recibe 4 parámetros:

* Window Handle
* Message Identifier
* wParam
* lParam

La función retorna un entero. El retorno debe ser interpretado según el tipo de mensaje procesado.

Como el procedimiento de ventana puede ser llamado recursivamente cuando se procesan los mensajes es conveniente no usar demasiadas variables locales en el mismo y realizar los procesos que demanden los mensajes mediante rutinas externas para no provocar un stack overflow.

En windows existe una función llamada DefWindowProc que define el comportamiento estándar y por defecto de cualquier ventana windows. Cuando escribimos procedimientos de ventana personalizados debemos llamar a esta función para cualquier mensaje que no procesemos explícitamente para dotar a la ventana de un comportamiento mínimo y estándar.

WinApi: Conceptos: Handles

También llamados Identificadores, Manejadores e incluso en algún libro ... Mangos.

Un handle básicamente es un número. Un número entero para ser mas exactos.

Windows usa los handles para hacer referencia a los objetos que maneja, estos objetos pueden ser ventanas, iconos, menús, procesos, etc.