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: Mensajes: Teclado

Mensaje

Descripción

WM_KEYDOWN

Es enviada a la ventana que tiene el foco. Solo si no es la tecla Alt o esta no está pulsada.

La tecla es recibida como un virtual key en el parámetro wParam. Debido a la auto repetición se pueden recibir varios keydown seguidos antes de recibir el keyup.

Si es un carácter entonces window colocara en la cola de mensajes un WM_CHAR o un WM_DEADCHAR

WM_SYSKEYDOWN

Es enviado cuando se pulsa la tecla Alt u otra estando Alt pulsada. Si no hay un control

con foco entonces la ventana activa recibirá todas las teclas como WM_SYSKEYDOWM

aunque la tecla ALT no esté pulsada. Si es un carácter colocara en la cola de mensajes un WM_SYSCHAR o WM_SYSDEADCHAR

WM_KEYUP

Es enviado cuando se suelta la tecla si no es la tecla Alt o esta pulsada. La tecla viene en wParam como un virtual key.

WM_SYSKEYUP

Es enviado cuando se suelta la tecla Alt o cualquier otra estando Alt pulsada. Tambien cuando no hay un control activo la ventana activa lo recibirá aunque no esté pulsada la tecla Alt.

WM_CHAR

Es mandada al control con foco cuando la tecla genera un carácter. El mensaje es creado por la función TranslateMessage del bucle de mensajes. También recibe el estado de la tecla control y Shift y cualquier carácter Dead pendiente (por ejemplo acentos).

El carácter se recibe en wParam.

WM_SYSCHAR

Es mandada al control con foco cuando la tecla genera un carácter y Alt esta pulsada o

Cuando la ventana no tiene ningún control con foco.

El mensaje es creado por la función TranslateMessage del bucle de mensajes.

También recibe el estado de la Tecla control y Shift y cualquier carácter Dead pendiente

(por ejemplo acentos).

El carácter se recibe en wParam.

WM_DEADCHAR

Es mandada al control con foco cuando se pulsa una tecla que genera un acento.

El mensaje es creado por la función TranslateMessage del bucle de mensajes.

Si el acento es válido el próximo mensaje será un WM_CHAR con el carácter acentuado.

Si no es válido será mandado un WM_CHAR con el acento solo y otro con el carácter.

WM_SYSDEADCHAR

Lo mismo que el anterior pero si esta pulsada la tecla Alt o la ventana activa no tiene un control activo. Con una excepción , si la tecla Alt se suelta antes de pulsar el carácter que va acentuado entonces se genera un WM_SYSCHAR para el acento y otro para el carácter sin acentuar.

WM_APPCOMMAND

Este mensaje se comporta distinto a los anteriores en el sentido que no es enviado al bucle de mensajes de la aplicación. Es enviado por la función DefWindowProc cuando se pulsan determinadas teclas como controles de sonido del teclado o botones extra de un ratón. Si la ventana destino no procesa el mensaje será enviado hacia el padre y si no hasta la ventana propietaria.

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.