Capítulo 7 Control básico Edit

Tal como hemos definido nuestro diálogo en el capítulo 6, no tiene mucha utilidad. Los diálogos se usan para intercambiar información entre la aplicación y el usuario, en ambas direcciones. El ejemplo 4 sólo lo hace en una de ellas.

En el capítulo anterior hemos usado dos controles (un texto estático y un botón), aunque sin saber exactamente cómo funcionan. En este capítulo veremos el uso del control de edición.

Un control edit es una ventana de control rectangular que permite al usuario introducir y editar texto desde el teclado.

Cuando está seleccionado muestra el texto que contiene y un cursor intermitente que indica el punto de inserción de texto. Para seleccionarlo el usuario puede hacer un click con el ratón en su interior o usar la tecla [TAB]. El usuario podrá entonces introducir texto, cambiar el punto de inserción, o seleccionar texto para ser borrado o movido usando el teclado o el ratón.

Un control de este tipo puede enviar mensajes a su ventana padre mediante WM_COMMAND, y la ventana padre puede enviar mensajes a un control edit en un cuadro de diálogo llamando a la función SendDlgItemMessage. Veremos algunos de estos mensajes en este capítulo, y el resto el capítulos más avanzados.

Fichero de recursos

Empezaremos definiendo el control edit en el fichero de recursos, y lo añadiremos a nuestro dialogo de prueba.

#include <windows.h>
#include "win005.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 "Texto:", -1, "STATIC", 
    SS_LEFT | WS_CHILD | WS_VISIBLE, 
    8, 9, 28, 8
 CONTROL "", ID_TEXTO, "EDIT", 
    ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 
    36, 9, 76, 12
 CONTROL "Aceptar", IDOK, "BUTTON", 
    BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 
    56, 26, 50, 14
END

Hemos hecho algunas modificaciones más. Para empezar, el control static se ha convertido en una etiqueta para el control edit, que indica al usuario qué tipo de información debe suministrar.

Hemos añadido el control edit a continuación del control static. Veremos que el orden en que aparecen los controles dentro del cuadro de diálogo es muy importante, al menos en aquellos controles que tengan el estilo WS_TABSTOP, ya que ese orden será el mismo en que se activen los controles cuando usemos la tecla TAB. Para más detalles acerca de los controles edit ver controles edit.

Pero ahora veamos cómo hemos definido nuestro control edit:

CONTROL "", ID_TEXTO, "EDIT", 
   ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 
   36, 9, 76, 12
  • 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 el interior del control, en este caso, ninguno.
  • id es el identificador del control. Los controles edit necesitan un identificador para que la aplicación pueda acceder a ellos. Usaremos un identificador definido en win005.h.
  • class es la clase de control, en nuestro caso "EDIT".
  • style es el estilo de control que queremos. En nuestro caso es una combinación de un estilo edit y varios de ventana:
    • ES_LEFT: indica que el texto en el interior del control se alineará a la izquierda.
    • WS_CHILD: crea el control como una ventana hija.
    • WS_VISIBLE: crea una ventana inicialmente visible.
    • WS_BORDER: se crea un control que tiene de borde una línea fina.
    • 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.

El procedimiento de diálogo y los controles edit

Para manejar el control edit desde nuestro procedimiento de diálogo tendremos que hacer algunas modificaciones.

Para empezar, los controles edit también pueden generar mensajes WM_COMMAND, de modo que debemos diferenciar el control que originó dicho mensaje y tratarlo de diferente modo según el caso.

        case WM_COMMAND:
           if(LOWORD(wParam) == IDOK) EndDialog(hDlg, FALSE);
           return TRUE;

En nuestro caso sigue siendo sencillo: sólo cerraremos el diálogo si el mensaje WM_COMMAND proviene del botón "Aceptar".

La otra modificación afecta al mensaje WM_INITDIALOG.

        case WM_INITDIALOG:
           SetFocus(GetDlgItem(hDlg, ID_TEXTO));
           return FALSE;  

De nuevo es una modificación sencilla, tan sólo haremos que el foco del teclado se coloque en el control edit, de modo que el usuario pueda empezar a escribir directamente, tan pronto como el diálogo haya aparecido en pantalla.

Para hacer eso usaremos la función SetFocus. Pero esta función requiere como parámetro el manipulador de ventana del control que debe recibir el foco, este manipulador lo conseguimos con la función GetDlgItem, que a su vez necesita como parámetros un manipulador del diálogo y el identificador del control.