Inicio Reflexiones Guitarra Engineering Programación Win32

Configuración de Ventanas
Capítulo 4, por Ricardo González Garza


Este capítulo supone que tienes experiencia en. . .
Manejo del entorno general de Windows
- ¿Qué es...? una ventana, un menú, un clic, etc.
C++:
- Manejo de variables, constantes, funciones, archivos de cabecera, punteros, etc.
- Uso del operador OR | para combinar números

Tiempo estimado de lectura y práctica: 45 min.

4.1 Ventanas en Windows

La interfaz de usuario basado en ventanas provee el equivalente de un escritorio en la pantalla. En un escritorio puede haber diferentes papeles, uno sobre otro, a menudo es posible observar fragmentos de diferentes páginas detrás del papel superior. El equivalente de este escritorio es Windows en una pantalla, y el equivalente de estos papeles son ventanas en la pantalla.

En un escritorio, como en Windows, es posible mover los papeles (o ventanas), eligiendo cual será el que estará encima de todos o cambiando qué tanto de otro documento se expone a la vista.

Una ventana estándar de Windows cuenta con los siguientes elementos:

  1. Menú de sistema. Es un menú que contiene las opciones de Maximizar, Minimizar, Cerrar, Mover, Restaurar y Cambiar el tamaño la ventana.
  2. Ícono del programa. Imagen que identifica al programa. Dar un clic sobre esta pequeña imagen muestra el menú del sistema.
  3. Título de ventana. Muestra un título para que el usuario pueda identificar a la ventana. Si se da un clic sobre esta y se arrastra, es posible mover a la ventana sobre la pantalla. Si se da doble clic sobre dicho título, es posible maximizar o restaurar el tamaño de la ventana. Un clic derecho muestra al menú sistema.
  4. Botón minimizar
  5. Botón maximizar
  6. Botón cerrar. Envía el mensaje WM_CLOSE, indicando que el usuario ha decidido finalizar la aplicación. Puede aprovecharse este mensaje para preguntar al usuario si desea guardar los cambios o impedir que se cierre la ventana en caso de haber un proceso importante llevándose a cabo. La manipulación de mensajes se verá en un capítulo posterior.
  7. Borde. Delimita el área del cliente de una ventana. Si la ventana lo permite, es por medio del borde que el usuario puede ajustar el tamaño de la ventana en pantalla.
  8. Área del cliente. Es la parte de la ventana en la cual el programa define su actividad.
fig. 4.1.1 Elementos de una ventana estándar

La ventana que tiene todos estos elementos se programa indicando en la función CreateWindowEx() en el primer y cuarto parámetro (dwStyle y dwExStyle) lo siguiente:

Ventana estándarCopiar cógido
  //Recuerde que el operador OR | sirve para combinar constantes numéricas

  DWORD dwEstilo = WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_OVERLAPPED
                 | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;

  DWORD dwExEstilo = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR;

  HWND h;
  h = CreateWindowEx(dwExEstilo, szClaseVentana, "Título", dwEstilo, ...);

  ...

  ShowWindow(h, ...);

En la ventana creada en el capítulo anterior, el parámetro dwEstilo se especificó como WS_OVERLAPPEDWINDOW, pero equivale exactamente a indicar las constantes anteriores. En la librería windows.h se definió esta constante debido a su uso común. Vea la definición:

Definición de WS_OVERLAPPEDWINDOW en winuser.hCopiar cógido
#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED   | WS_CAPTION      | WS_SYSMENU      | \
                             WS_THICKFRAME   | WS_MINIMIZEBOX  | WS_MAXIMIZEBOX)

Además, dwExEstilo se indicó como 0. Dado que WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR valen 0, pueden omitirse.

La función ShowWindow() sirve usa para mostrar/ocultar a la ventana, y lo que hace es modificar el estilo de ventana dwEstilo en memoria añadiendo o quitando la constante WS_VISIBLE.

Al crear la ventana, Windows añade automáticamente la constante WS_CLIPSIBLINGS a dwEstilo para evitar dibujar los controles dentro del área de cliente innecesariamente, esto no es de importancia por el momento. También añade la constante WS_EX_WINDOWEDGE a dwExEstilo para indicar que la ventana tiene un borde elevado como las ventanas de Windows 95 y versiones posteriores, y lo hace por cuestiones de comptabilidad con los antiguos sistemas Windows.

fig. 4.1.2 Antiguo borde de ventana en Windows 3.11

4.2 Modificar el aspecto de la ventana

De los elementos de una ventana, el más importante es el Área del cliente y Windows permite configurar la ventana para ocultar o deshabilitar el resto de los elementos por medio de los estilos de ventana que se indican en la función CreateWindowEx() en el primer y cuarto parámetro (dwStyle y dwExStyle).

Por ejemplo, si se elimina la constante WS_SYSMENU de dwStyle, eliminará el menú del sistema y con ello los botones maximizar, minimizar y cerrar. La ventana se puede cerrar presionando la combinación Alt + F4. Vea la imagen siguiente:

fig. 4.2.1 Ventana sin WS_SYSMENU, que elimina el menú del sistema

De la misma manera, es posible eliminar diferentes constantes del parámetro dwStyle para deshabilitar u ocultar los siguientes elementos, ejemplo:

fig. 4.2.2 Ventana sin WS_MAXIMIZEBOX, que deshabilita el botón maximizar

fig. 4.2.3 Ventana sin WS_MINIMIZEBOX, que deshabilita el botón minimizar

fig. 4.2.4 Ventana sin WS_MAXIMIZEBOX | WS_MINIMIZEBOX, que deshabilita el botón maximizar y minimizar

Para que la ventana se muestre sobre todas las demás incluso cuando este desactivdada, agregue la constante WS_EX_TOPMOST a dwExStyle.

4.3 Ventana de tamaño fijo

El borde la ventana permite al usuario modificar el tamaño de ésta, pero en ocasiones es importante impedir al usuario modificar el tamaño de la ventana. Por ello, Windows ofrece la posibilidad de crear una ventana de tamaño fijo. Es mayormente utilizada en cuadros de diálogo que solicitan al usuario información específica, donde permitir al usuario que cambie el tamaño de la ventana resulta completamente innecesario.

Una ventana de tamaño fijo se crea omitiendo la constante WS_THICKFRAME. El borde es ligeramente más delgado e impide al usuario modificar el tamaño de la ventana.

fig. 4.3.1 Ventana sin WS_THICKFRAME

Cuando se crea una ventana de tamaño fijo, es importante deshabilitar los botones de maximizar y minimizar (sin WS_MAXIMIZEBOX | WS_MINIMIZEBOX), ya que estos siguen estando a la vista. Para un cuadro de diálogo, elimine WS_THICKFRAME y agregue WS_EX_DLGMODALFRAME en dwExStyle.

Existe otra ventana con un borde diferente, se consigue modificando el estilo dwExStyle al cambiar WS_EX_WINDOWEDGE por WS_EX_OVERLAPPEDWINDOW. Esta constante agrega un relieve 3D alrededor del borde.

fig. 4.3.2 Ventana con WS_EX_OVERLAPPEDWINDOW y sin WS_MAXIMIZEBOX | WS_MINIMIZEBOX ni WS_EX_WINDOWEDGE

De la misma manera, cambiar WS_EX_WINDOWEDGE por WS_EX_PALETTEWINDOW crea una ventana como sigue:

fig. 4.3.3 Ventana con WS_EX_PALETTEWINDOW y sin WS_MAXIMIZEBOX | WS_MINIMIZEBOX ni WS_EX_WINDOWEDGE

4.4 Ventana emergente

Este tipo de ventana muestra solamente el elemento más importante de la ventana, el Área del cliente. Los he visto utilizados en mensajes emergentes que dan avisos o recomendaciones y se autodestruyen. Se programa de la siguiente manera:

Ventana emergenteCopiar cógido
  //Recuerde que el operador OR | sirve para combinar constantes numéricas

  DWORD dwEstilo = WS_POPUP;

  DWORD dwExEstilo = 0;

  HWND h;
  h = CreateWindowEx(dwExEstilo, szClaseVentana, "Título", dwEstilo, ...);

  ...

Si se muestra esta ventana de manera maximizada, abarcará por completo el área de la pantalla. Este tipo de ventana resulta particularmente útil para evitar presuntos distractores que pudieran causar otras ventanas o elementos de Windows como la barra de tareas. No muestra la barra de título, ni el ícono del programa, ni los botones de maximizar, minimizar o cerrar. Utilizada mayormente en aplicaciones que requieren toda la atención del usuario, como juegos. Utilice ShowWindow() para maximizar a la ventana.

Ventana emergente a pantalla completaCopiar cógido
  //Recuerde que el operador OR | sirve para combinar constantes numéricas

  DWORD dwEstilo = WS_POPUP;

  DWORD dwExEstilo = 0;

  HWND h;
  h = CreateWindowEx(dwExEstilo, szClaseVentana, "Título", dwEstilo, ...);

  ...

  ShowWindow(hwnd, SW_SHOWMAXIMIZED);

4.5 El uso de la tecla TAB

Si se indica el estilo de ventana extendido WS_EX_CONTROLPARENT en la función CreateWindowEx(), se permitirá al usuario navegar por las ventanas hijas (controles) utilizando la tecla TAB; esto cambia el foco del control activo en pantalla.

4.6 Ejercicios

1. Jugar con las propiedades de ventana. Hice el siguiente programa que crea código para ventanas mostrando las configuraciones más comunes que pueden modificarse. Tómese un tiempo para crear diversas ventanas y ver los cambios que se realizan en el código generado. Descargue CreateWindow.zip (52.9 kb)

fig. 4.6.1 Creador de código de ventana utilizado en el ejercicio 2.


comentarios@rickygzz.com.mx