Capítulo 6 Diálogo básico

Los cuadros de diálogo son la forma de ventana más habitual de comunicación entre una aplicación Windows y el usuario. Para facilitar la tarea del usuario a la hora de introducir datos, existen varios tipos de controles, cada uno de ellos diseñado para un tipo específico de información. Los más comunes son los "static", "edit", "button", "listbox", "scroll", "combobox", "group", "checkbutton" y "ratiobutton". A partir de Windows 95 se indrodujeron varios controles nuevos: "updown", "listview", "treeview", "gauge", "tab" y "trackbar".

En realidad, un cuadro de diálogo es una ventana normal, aunque con algunas peculiaridades. También tiene su procedimiento de ventana (procedimiento de diálogo), pero puede devolver un valor a la ventana que lo invoque.

Igual que los menús, los cuadros de diálogo se pueden construir durante la ejecución o a partir de un fichero de recursos.

Ficheros de recursos

La mayoría de los compiladores de C/C++ que incluyen soporte para Windows poseen herramientas para la edición de recursos: menús, diálogos, bitmaps, etc. Sin embargo considero que es interesante que aprendamos a construir nuestros recursos con un editor de textos, cada compilador tiene sus propios editores de recursos, y no tendría sentido explicar cada uno de ellos. El compilador que usamos "Dev C++", en su versión 4, tiene un editor muy limitado y no aconsejo su uso. De hecho, en la versión actual ya no se incluye, y los ficheros de recursos se editan en modo texto.

De modo que aprenderemos a hacer cuadros de diálogo igual que hemos aprendido a hacer menús: usando el editor de texto.

Para el primer programa de ejemplo de programa con diálogos, que será el ejemplo 4, partiremos de nuevo del programa del ejemplo 1. Nuestro primer diálogo será muy sencillo: un simple cuadro con un texto y un botón de "Aceptar".

Este es el código del fichero de recursos:

#include <windows.h>
#include "win004.h"

Menu MENU 
BEGIN
 POPUP "&Principal"
 BEGIN
  MENUITEM "&Diálogo", CM_DIALOGO
 END
END

DialogoPrueba DIALOG 0, 0, 118, 48
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
CAPTION "Diálogo de prueba"
FONT 8, "Helv"
BEGIN
 CONTROL "Mensaje de prueba", TEXTO, "static", 
    SS_LEFT | WS_CHILD | WS_VISIBLE, 
    8, 9, 84, 8
 CONTROL "Aceptar", IDOK, "button", 
    BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 
    56, 26, 50, 14
END

Necesitamos incluir el fichero "windows.h" ya que en él se definen muchas constantes, como por ejemplo "IDOK" que es el identificador que se usa para el botón de "Aceptar".

También necesitaremos el fichero "win004.h", para definir los identificadores que usaremos en nuestro programa, por ejemplo el identificador del comando de menú para abrir nuestro diálogo.

/* Identificadores */ 

/* Identificadores de comandos */
#define CM_DIALOGO 101
#define TEXTO	   100

Lo primero que hemos definido es un menú para poder comunicarle a nuestra aplicación que queremos abrir un cuadro de diálogo.

A continuación está la definición del diálogo, que se compone de varias líneas. Puedes ver más detalles en el apartado de recursos dedicado al recurso diálogo.

De momento bastará con un identificador, como el que usábamos para los menús, y además las coordenadas y dimensiones del diálogo.

En cuanto a los estilos, las constantes para definir los estilos de ventana, que comienzan con "WS_", puedes verlos con detalle en la sección de constantes "estilos de ventana". Y los estilos de diálogos, que comienzan con "DS_", en "estilos de diálogo".

Para empezar, hemos definido los siguientes estilos:

  • DS_MODALFRAME: indica que se creará un cuadro de diálogo con un marco de dialog-box modal que puede combinarse con una barra de título y un menú de sistema.
  • WS_POPUP: crea una ventana "pop-up".
  • WS_VISIBLE: crea una ventana inicialmente visible.
  • WS_CAPTION: crea una ventana con una barra de título, (incluye el estilo WS_BORDER).

La siguiente línea es la de CAPTION, en ella especificaremos el texto que aparecerá en la barra de título del diálogo.

La línea de FONT sirve para especificar el tamaño y el tipo de fuente de caracteres que usará nuestro diálogo.

Después está la zona de controles, en nuestro ejemplo sólo hemos incluido un texto estático y un botón.

Un control estático (static) nos sirve para mostrar textos o rectángulos, que podemos usar para informar al usuario de algo, como etiquetas o como adorno. Para más detalles ver control static.

CONTROL "Mensaje de prueba", -1, "static", 
   SS_LEFT | WS_CHILD | WS_VISIBLE, 
   8, 9, 84, 8
  • CONTROL es una palabra clave que indica que vamos a definir un control.
  • A continuación, en el parámetro text, introducimos el texto que se mostrará.
  • id es el identificador del control. Como los controles static no se suelen manejar por las aplicaciones no necesitamos un identificador, así que ponemos -1.
  • class es la clase de control, en nuestro caso "static".
  • style es el estilo de control que queremos. En nuestro caso es una combinación de un estilo estático y varios de ventana:
    • SS_LEFT: indica un simple rectángulo y el texto suministrado se alinea en su interior a la izquierda.
    • WS_CHILD: crea el control como una ventana hija.
    • WS_VISIBLE: crea una ventana inicialmente visible.
  • coordenada x del control.
  • coordenada y del control.
  • width: anchura del control.
  • height: altura del control.

El control button nos sirve para comunicarnos con el diálogo, podemos darle comandos del mismo tipo que los que proporciona un menú. Para más detalles ver recurso button.

CONTROL "Aceptar", IDOK, "button", 
   BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 
   56, 26, 50, 14
  • CONTROL es una palabra clave que indica que vamos a definir un control.
  • A continuación, en el parámetro text, introducimos el texto que se mostrará en su interior.
  • id es el identificador del control. Nuestra aplicación recibirá este identificador junto con el mensaje WM_COMMAND cuando el usuario active el botón. La etiqueta IDOK está definida en el fichero Windows.h.
  • class es la clase de control, en nuestro caso "button".
  • style es el estilo de control que queremos. En nuestro caso es una combinación de varios estilos de button y varios de ventana:
    • BS_PUSHBUTTON: crea un botón corriente que envía un mensaje WM_COMMAND a su ventana padre cuando el usuario selecciona el botón.
    • BS_CENTER: centra el texto horizontalmente en el área del botón.
    • WS_CHILD: crea el control como una ventana hija.
    • WS_VISIBLE: crea una ventana inicialmente visible.
    • WS_TABSTOP: define un control que puede recibir el foco del teclado cuando el usuario pulsa la tecla TAB. Presionando la tecla TAB, el usuario mueve el foco del teclado al siguiente control con el estilo WS_TABSTOP.
  • coordenada x del control.
  • coordenada y del control.
  • width: anchura del control.
  • height: altura del control.