Compartir a través de


Consideraciones sobre la programación de cuadros de diálogo

En esta introducción se describen algunas consideraciones de programación relativas a los cuadros de diálogo.

La información general incluye los temas siguientes.

Procedimientos del cuadro de diálogo

Un procedimiento de cuadro de diálogo es similar a un procedimiento de ventana en el que el sistema envía mensajes al procedimiento cuando tiene información para dar o realizar tareas. A diferencia de un procedimiento de ventana, un procedimiento de cuadro de diálogo nunca llama a la función DefWindowProc . En su lugar, devuelve TRUE si procesa un mensaje o FALSE si no lo hace.

Cada procedimiento de cuadro de diálogo tiene el siguiente formato:

BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
 
        // Place message cases here. 
 
        default: 
            return FALSE; 
    } 
}

Los parámetros de procedimiento tienen el mismo propósito que en un procedimiento de ventana, con el parámetro hwndDlg que recibe el identificador de ventana del cuadro de diálogo.

La mayoría de los procedimientos de cuadro de diálogo procesan el mensaje WM_INITDIALOG y los mensajes de WM_COMMAND enviados por los controles, pero procesan algunos si hay otros mensajes. Si un procedimiento de cuadro de diálogo no procesa un mensaje, debe devolver FALSE para dirigir al sistema para procesar los mensajes internamente. La única excepción a esta regla es el mensaje WM_INITDIALOG . El procedimiento del cuadro de diálogo debe devolver TRUE para dirigir al sistema para procesar aún más el mensaje de WM_INITDIALOG . En cualquier caso, el procedimiento no debe llamar a DefWindowProc.

Mensaje de WM_INITDIALOG

El sistema no envía un mensaje WM_CREATE al procedimiento del cuadro de diálogo. En su lugar, envía un mensaje de WM_INITDIALOG cuando crea el cuadro de diálogo y todos sus controles, pero antes de mostrar el cuadro de diálogo. El procedimiento debe llevar a cabo cualquier inicialización necesaria para asegurarse de que el cuadro de diálogo muestra la configuración actual asociada a la tarea. Por ejemplo, cuando un cuadro de diálogo contiene un control para mostrar la unidad y el directorio actuales, el procedimiento debe determinar la unidad y el directorio actuales y establecer el control en ese valor.

El procedimiento puede inicializar controles mediante funciones como SetDlgItemText y CheckDlgButton. Dado que los controles son ventanas, el procedimiento también puede manipularlos mediante funciones de administración de ventanas como EnableWindow y SetFocus. El procedimiento puede recuperar el identificador de ventana en un control mediante la función GetDlgItem .

El procedimiento del cuadro de diálogo puede cambiar el contenido, el estado y la posición de cualquier control según sea necesario. Por ejemplo, en un cuadro de diálogo que contiene un cuadro de lista de nombres de archivo y un botón Abrir , el procedimiento puede deshabilitar el botón Abrir hasta que el usuario seleccione un archivo de la lista. En este ejemplo, la plantilla del cuadro de diálogo especifica el estilo de WS_DISABLED para el botón Abrir y el sistema deshabilita automáticamente el botón al crearlo. Cuando el procedimiento del cuadro de diálogo recibe un mensaje de notificación del cuadro de lista que indica que el usuario ha seleccionado un archivo, el procedimiento llama a la función EnableWindow para habilitar el botón Abrir .

Para mostrar un icono personalizado en la barra de subtítulo del cuadro de diálogo, el controlador de WM_INITDIALOG puede enviar el mensaje WM_SETICON al cuadro de diálogo.

Si la aplicación crea el cuadro de diálogo mediante una de las funciones DialogBoxParam, DialogBoxIndirectParam, CreateDialogParam o CreateDialogIndirectParam, el parámetro lParam del WM_INITDIALOG mensaje contiene el parámetro extra pasado a la función. Las aplicaciones suelen usar este parámetro adicional para pasar un puntero a información de inicialización adicional al procedimiento del cuadro de diálogo, pero el procedimiento del cuadro de diálogo debe determinar el significado del parámetro. Si la aplicación usa otra función para crear el cuadro de diálogo, el sistema establece el parámetro lParam en NULL.

Antes de devolver el mensaje de WM_INITDIALOG , el procedimiento debe determinar si debe establecer el foco de entrada en un control especificado. Si el procedimiento del cuadro de diálogo devuelve TRUE, el sistema establece automáticamente el foco de entrada en el control cuyo identificador de ventana se encuentra en el parámetro wParam . Si el control que recibe el foco predeterminado no es adecuado, puede establecer el foco en el control adecuado mediante la función SetFocus . Si el procedimiento establece el foco de entrada, debe devolver FALSE para evitar que el sistema establezca el foco predeterminado. El control que recibe el foco de entrada predeterminado es siempre el primer control especificado en la plantilla que está visible, no deshabilitado y tiene el estilo WS_TABSTOP . Si no existe este control, el sistema establece el foco de entrada predeterminado en el primer control de la plantilla.

Mensaje de WM_COMMAND

Un control puede enviar un mensaje WM_COMMAND al procedimiento del cuadro de diálogo cuando el usuario lleva a cabo una acción en el control. Estos mensajes, llamados mensajes de notificación, informan al procedimiento de entrada del usuario y permiten que lleve a cabo las respuestas adecuadas.

Todos los controles predefinidos, excepto los controles estáticos, envían mensajes de notificación para las acciones de usuario seleccionadas. Por ejemplo, un botón de inserción envía el mensaje de notificación BN_CLICKED cada vez que el usuario hace clic en el botón. En todos los casos, la palabra de orden bajo del parámetro wParam contiene el identificador de control, la palabra de orden superior de wParam contiene el código de notificación y el parámetro lParam contiene el identificador de la ventana de control.

El procedimiento del cuadro de diálogo debe supervisar y procesar los mensajes de notificación. En particular, el procedimiento debe procesar mensajes que tengan los identificadores IDOK o IDCANCEL; estos mensajes representan una solicitud del usuario para cerrar el cuadro de diálogo. El procedimiento debe cerrar el cuadro de diálogo mediante la función EndDialog para los cuadros de diálogo modales y la función DestroyWindow para los cuadros de diálogo modeless.

El sistema también envía mensajes WM_COMMAND al procedimiento del cuadro de diálogo si el cuadro de diálogo tiene un menú, como el menú de la ventana , y el usuario hace clic en un elemento de menú. En concreto, el sistema envía un mensaje de WM_COMMAND con el parámetro wParam establecido en IDCANCEL cada vez que el usuario hace clic en Cerrar en el menú de la ventana del cuadro de diálogo. El mensaje es casi idéntico al mensaje de notificación enviado por el botón Cancelar y debe procesarse exactamente de la misma manera.

Mensaje de WM_PARENTNOTIFY

Un control envía un mensaje de WM_PARENTNOTIFY cada vez que el usuario presiona un botón del mouse mientras apunta al control. Algunas aplicaciones interpretan este mensaje como una señal para llevar a cabo una acción relacionada con el control, como mostrar una línea de texto que describa el propósito del control.

El sistema también envía mensajes WM_PARENTNOTIFY cuando crea y destruye una ventana, pero no para los controles creados a partir de una plantilla de cuadro de diálogo. El sistema evita estos mensajes especificando el estilo WS_EX_NOPARENTNOTIFY al crear los controles. Una aplicación no puede invalidar este comportamiento predeterminado a menos que cree sus propios controles para el cuadro de diálogo.

mensajes de Control-Color

Los controles y el sistema pueden enviar mensajes de color de control cuando quieran que el procedimiento del cuadro de diálogo pinte el fondo de un control u otra ventana mediante un pincel y colores específicos. Esto puede ser útil cuando las aplicaciones invalidan los colores predeterminados usados en los cuadros de diálogo y sus controles. A continuación se muestran los mensajes de color de control, que han reemplazado al mensaje WM_CTLCOLOR .

Un control envía un mensaje de color de control al procedimiento del cuadro de diálogo justo antes de pintar su propio fondo. El mensaje permite al procedimiento especificar qué pincel usar y para establecer los colores de fondo y primer plano. El procedimiento especifica un pincel devolviendo el identificador de pincel. Para establecer los colores de fondo y primer plano, el procedimiento usa las funciones SetBkColor y SetTextColor con el contexto del dispositivo de visualización del control. El mensaje de color de control pasa un identificador al contexto del dispositivo para mostrar al procedimiento en el parámetro wParam del mensaje.

El sistema envía un mensaje WM_CTLCOLORDLG al procedimiento del cuadro de diálogo si el procedimiento no procesa el mensaje WM_ERASEBKGND . La clase de cuadro de diálogo predefinida no tiene un pincel de fondo de clase, por lo que este mensaje permite al procedimiento definir su propio fondo sin tener que incluir el código para llevar a cabo el trabajo.

En cualquier caso, cuando un procedimiento de cuadro de diálogo no procesa un mensaje de color de control, el sistema usa un pincel con el color de ventana predeterminado para pintar el fondo de todos los controles y ventanas excepto las barras de desplazamiento. Una aplicación puede recuperar el color de ventana predeterminado pasando el valor de COLOR_WINDOW a la función GetSysColor . Mientras se pinta el fondo, el color de primer plano del contexto del dispositivo de visualización se establece en el color de texto predeterminado (COLOR_WINDOWTEXT). En el caso de las barras de desplazamiento, el sistema usa un pincel que tiene el color predeterminado de la barra de desplazamiento (COLOR_SCROLLBAR). En este caso, los colores de fondo y primer plano del contexto del dispositivo de visualización se establecen en blanco y negro, respectivamente.

Procesamiento de mensajes predeterminado del cuadro de diálogo

El procedimiento de ventana de la clase de cuadro de diálogo predefinido lleva a cabo el procesamiento predeterminado de todos los mensajes que el procedimiento del cuadro de diálogo no procesa. Cuando el procedimiento del cuadro de diálogo devuelve FALSE para cualquier mensaje, el procedimiento de ventana predefinido comprueba los mensajes y lleva a cabo las siguientes acciones predeterminadas:

Message Acción predeterminada
DM_GETDEFID Puede enviar este mensaje a un cuadro de diálogo. El cuadro de diálogo devuelve el identificador de control del botón de inserción predeterminado, si el cuadro de diálogo tiene uno; de lo contrario, devuelve cero.
DM_REPOSITION Puede enviar este mensaje a un cuadro de diálogo de nivel superior. El cuadro de diálogo se cambia de posición para que se ajuste al área de escritorio.
DM_SETDEFID Puede enviar este mensaje a un cuadro de diálogo. El cuadro de diálogo establece el botón de inserción predeterminado en el control especificado por el identificador de control en el parámetro wParam .
WM_ACTIVATE Restaura el foco de entrada en el control identificado por el identificador guardado anteriormente si se activa el cuadro de diálogo. De lo contrario, el procedimiento guarda el identificador en el control que tiene el foco de entrada.
WM_CHARTOITEM Devuelve cero.
WM_CLOSE Envía el mensaje de notificación BN_CLICKED al cuadro de diálogo y especifica IDCANCEL como identificador de control. Si el cuadro de diálogo tiene un identificador de control IDCANCEL y el control está deshabilitado actualmente, el procedimiento suena una advertencia y no publica el mensaje.
WM_COMPAREITEM Devuelve cero.
WM_ERASEBKGND Rellena el área cliente del cuadro de diálogo mediante el pincel devuelto por el mensaje de WM_CTLCOLORDLG o con el color de ventana predeterminado.
WM_GETFONT Devuelve un identificador a la fuente del cuadro de diálogo definido por la aplicación.
WM_INITDIALOG Devuelve cero.
WM_LBUTTONDOWN Envía un mensaje CB_SHOWDROPDOWN al cuadro combinado que tiene el foco de entrada y dirige el control para ocultar su cuadro de lista desplegable. El procedimiento llama a DefWindowProc para completar la acción predeterminada.
WM_NCDESTROY Libera la memoria global asignada para los controles de edición en el cuadro de diálogo (se aplica a los cuadros de diálogo que especifican el estilo DS_LOCALEDIT ) y libera cualquier fuente definida por la aplicación (se aplica a los cuadros de diálogo que especifican el estilo DS_SETFONT o DS_SHELLFONT ). El procedimiento llama a la función DefWindowProc para completar la acción predeterminada.
WM_NCLBUTTONDOWN Envía un mensaje CB_SHOWDROPDOWN al cuadro combinado que tiene el foco de entrada y dirige el control para ocultar su cuadro de lista desplegable. El procedimiento llama a DefWindowProc para completar la acción predeterminada.
WM_NEXTDLGCTL Establece el foco de entrada en el control siguiente o anterior del cuadro de diálogo, en el control identificado por el identificador en el parámetro wParam , o en el primer control del cuadro de diálogo que está visible, no deshabilitado y tiene el estilo WS_TABSTOP . El procedimiento omite este mensaje si la ventana actual con el foco de entrada no es un control .
WM_SETFOCUS Establece el foco de entrada en el control identificado por un identificador de ventana de control guardado anteriormente. Si no existe este identificador, el procedimiento establece el foco de entrada en el primer control de la plantilla del cuadro de diálogo visible, no deshabilitado y tiene el estilo WS_TABSTOP . Si no existe este control, el procedimiento establece el foco de entrada en el primer control de la plantilla.
WM_SHOWWINDOW Guarda un identificador en el control que tiene el foco de entrada si el cuadro de diálogo está oculto y, a continuación, llama a DefWindowProc para completar la acción predeterminada.
WM_SYSCOMMAND Guarda un identificador en el control que tiene el foco de entrada si el cuadro de diálogo se está minimizando y, a continuación, llama a DefWindowProc para completar la acción predeterminada.
WM_VKEYTOITEM Devuelve cero.

El procedimiento de ventana predefinido pasa todos los demás mensajes a DefWindowProc para el procesamiento predeterminado.

Interfaz de teclado del cuadro de diálogo

El sistema proporciona una interfaz de teclado especial para cuadros de diálogo que lleva a cabo un procesamiento especial para varias teclas. La interfaz genera mensajes que corresponden a determinados botones del cuadro de diálogo o cambia el foco de entrada de un control a otro. A continuación se muestran las claves usadas en esta interfaz y sus respectivas acciones.

Clave Acción
ALT+mnemonic Mueve el foco de entrada al primer control (teniendo el estilo WS_TABSTOP ) después del control estático que contiene la mnemónica especificada.
ABAJO Mueve el foco de entrada al siguiente control del grupo.
ENTRAR Envía un mensaje WM_COMMAND al procedimiento del cuadro de diálogo. El parámetro wParam se establece en IDOK o identificador de control del botón de inserción predeterminado.
ESC Envía un mensaje WM_COMMAND al procedimiento del cuadro de diálogo. El parámetro wParam se establece en IDCANCEL.
LEFT Mueve el foco de entrada al control anterior del grupo.
Mnemónica Mueve el foco de entrada al primer control (teniendo el estilo WS_TABSTOP ) después del control estático que contiene la mnemónica especificada.
RIGHT Mueve el foco de entrada al siguiente control del grupo.
MAYÚS+TAB Mueve el foco de entrada al control anterior que tiene el estilo WS_TABSTOP .
TAB Mueve el foco de entrada al siguiente control que tiene el estilo WS_TABSTOP .
UP Mueve el foco de entrada al control anterior del grupo.

El sistema proporciona automáticamente la interfaz de teclado para todos los cuadros de diálogo modales. No proporciona la interfaz para los cuadros de diálogo modeless a menos que la aplicación llame a la función IsDialogMessage para filtrar los mensajes en su bucle de mensajes principal. Esto significa que la aplicación debe pasar el mensaje a IsDialogMessage inmediatamente después de recuperar el mensaje de la cola de mensajes. La función procesa los mensajes si es para el cuadro de diálogo y devuelve un valor distinto de cero para indicar que el mensaje se ha procesado y no debe pasarse a la función TranslateMessage o DispatchMessage .

Dado que la interfaz de teclado del cuadro de diálogo usa teclas de dirección para moverse entre los controles de un cuadro de diálogo, una aplicación no puede usar estas teclas para desplazar el contenido de ningún cuadro de diálogo modal o ningún cuadro de diálogo modelal para el que se llama a IsDialogMessage . Cuando un cuadro de diálogo tiene barras de desplazamiento, la aplicación debe proporcionar una interfaz de teclado alternativa para las barras de desplazamiento. Tenga en cuenta que la interfaz del mouse para desplazarse está disponible cuando el sistema incluye un mouse.

Estilo de WS_TABSTOP

El estilo de WS_TABSTOP especifica los controles a los que el usuario puede mover presionando la tecla TAB o teclas MAYÚS+TAB.

Cuando el usuario presiona TAB o MAYÚS+TAB, el sistema determina primero si el control que tiene actualmente el foco de entrada procesa estas teclas. Envía el control un mensaje de WM_GETDLGCODE y, si el control devuelve DLGC_WANTTAB, el sistema pasa las claves al control. De lo contrario, el sistema usa la función GetNextDlgTabItem para buscar el siguiente control visible, no deshabilitado y que tiene el estilo WS_TABSTOP . La búsqueda comienza con el control que tiene actualmente el foco de entrada y continúa en el orden en que se crearon los controles, es decir, el orden en que se definen en la plantilla del cuadro de diálogo. Cuando el sistema localiza un control que tiene las características necesarias, el sistema mueve el foco de entrada a él.

Si la búsqueda del siguiente control con el estilo WS_TABSTOP encuentra una ventana con el estilo WS_EX_CONTROLPARENT , el sistema busca recursivamente los elementos secundarios de la ventana.

Una aplicación también puede usar GetNextDlgTabItem para buscar controles que tengan el estilo WS_TABSTOP . La función recupera el identificador de ventana del control siguiente o anterior que tiene el estilo WS_TABSTOP sin mover el foco de entrada.

Estilo de WS_GROUP

De forma predeterminada, el sistema mueve el foco de entrada al control siguiente o anterior cada vez que el usuario presiona una tecla de dirección. Siempre que el control actual con el foco de entrada no procese estas teclas y el control siguiente o anterior no sea un control estático, el sistema sigue desplazando el foco de entrada a través de todos los controles del cuadro de diálogo a medida que el usuario sigue presionando las teclas de dirección.

Una aplicación puede usar el estilo WS_GROUP para modificar este comportamiento predeterminado. El estilo marca el principio de un grupo de controles. Si un control del grupo tiene el foco de entrada cuando el usuario comienza a presionar teclas de dirección, el foco permanece en el grupo. En general, el primer control de un grupo debe tener el estilo WS_GROUP y todos los demás controles del grupo no deben tener este estilo. Todos los controles del grupo deben ser contiguos; es decir, deben haberse creado de forma consecutiva sin controles intermedios.

Cuando el usuario presiona una tecla de dirección, el sistema determina primero si el control actual que tiene el foco de entrada procesa las teclas de dirección. El sistema envía un mensaje de WM_GETDLGCODE al control y, si el control devuelve el valor de DLGC_WANTARROWS , pasa la clave al control. De lo contrario, el sistema usa la función GetNextDlgGroupItem para determinar el siguiente control del grupo.

GetNextDlgGroupItem busca controles en el orden (o orden inverso) que se crearon. Si el usuario presiona la tecla RIGHT o DOWN, GetNextDlgGroupItem devuelve el siguiente control si ese control no tiene el estilo WS_GROUP . De lo contrario, la función invierte el orden de la búsqueda y devuelve el primer control que tiene el estilo WS_GROUP . Si el usuario presiona la tecla LEFT o UP, la función devuelve el control anterior a menos que el control actual ya tenga el estilo WS_GROUP . Si el control actual tiene este estilo, la función invierte el orden de la búsqueda, busca el primer control que tiene el estilo WS_GROUP y devuelve el control que precede inmediatamente al control ubicado.

Si la búsqueda del siguiente control del grupo encuentra una ventana con el estilo WS_EX_CONTROLPARENT , el sistema busca recursivamente los elementos secundarios de la ventana.

Una vez que el sistema tiene el control siguiente o anterior, envía un mensaje WM_GETDLGCODE al control para determinar el tipo de control. A continuación, el sistema mueve el foco de entrada para controlar si no es un control estático. Si el control es un botón de radio automático, el sistema le envía un mensaje de BM_CLICK . Una aplicación también puede usar GetNextDlgGroupItem para buscar controles en un grupo.

Por lo general, el primer control del grupo combina los estilos WS_GROUP y WS_TABSTOP para que el usuario pueda pasar de grupo a grupo mediante la tecla TAB. Si el grupo contiene botones de radio, la aplicación debe aplicar el estilo WS_TABSTOP solo al primer control del grupo. El sistema mueve automáticamente el estilo cuando el usuario se mueve entre los controles del grupo. Esto garantiza que el foco de entrada siempre estará en el control seleccionado más recientemente cuando el usuario se mueva al grupo mediante la tecla TAB.

Mnemónicas

Un mnemonic es una letra o dígito seleccionado en la etiqueta de un botón o en el texto de un control estático. El sistema mueve el foco de entrada al control asociado con el mnemónico cada vez que el usuario presiona la tecla que corresponde a la mnemónica o presiona esta tecla y la tecla ALT en combinación. Los Mnemonics proporcionan una manera rápida para que el usuario pase a un control especificado mediante el teclado.

Una aplicación crea una mnemonic para un control insertando la y comercial (&) inmediatamente antes de la letra o el dígito seleccionados en la etiqueta o el texto del control. En la mayoría de los casos, la cadena terminada en null proporcionada con el control de la plantilla del cuadro de diálogo contiene la y comercial. Sin embargo, una aplicación puede crear una mnemonic en cualquier momento reemplazando la etiqueta o el texto existentes de un control mediante la función SetDlgItemText . Solo se puede especificar un mnemonic para cada control. Aunque se recomienda, los mnemonics de un cuadro de diálogo no deben ser únicos.

Cuando el usuario presiona una letra o una tecla de dígito, el sistema determina primero si el control actual que tiene el foco de entrada procesa la tecla. El sistema envía un mensaje de WM_GETDLGCODE al control y, si el control devuelve el valor DLGC_WANTALLKEYS o DLG_WANTMESSAGE , el sistema pasa la clave al control. De lo contrario, busca un control cuyo mnemonic coincida con la letra o el dígito especificados. Continúa buscando hasta que localiza un control o ha examinado todos los controles. Durante la búsqueda, omite los controles estáticos que tengan el estilo SS_NOPREFIX .

Si la búsqueda de un control con un mnemonic coincidente encuentra una ventana con el estilo WS_EX_CONTROLPARENT , el sistema busca recursivamente los elementos secundarios de la ventana.

Si el sistema localiza un control estático y el control no está deshabilitado, el sistema mueve el foco de entrada al primer control después del control estático visible, no deshabilitado y que tiene el estilo WS_TABSTOP . Si el sistema localiza algún otro control que tenga una mnemonic coincidente, mueve el foco de entrada a ese control. Si el control es un botón de inserción predeterminado, el sistema envía un mensaje de notificación BN_CLICKED al procedimiento del cuadro de diálogo. Si el control es otro estilo de botón y no hay ningún otro control en el cuadro de diálogo que tenga el mismo mnemónico, el sistema envía el mensaje BM_CLICK al control.

Configuración del cuadro de diálogo

La configuración del cuadro de diálogo son las selecciones y valores actuales de los controles del cuadro de diálogo. El procedimiento del cuadro de diálogo es responsable de inicializar los controles en esta configuración al crear el cuadro de diálogo. También es responsable de recuperar la configuración actual de los controles antes de destruir el cuadro de diálogo. Los métodos usados para inicializar y recuperar la configuración dependen del tipo de control.

Para obtener más información, vea los temas siguientes:

Botones de radio y casillas

Los cuadros de diálogo usan botones de radio y casillas para permitir que el usuario elija una lista de opciones. Los botones de radio permiten al usuario elegir entre opciones mutuamente excluyentes; las casillas permiten al usuario elegir una combinación de opciones.

El procedimiento del cuadro de diálogo puede establecer el estado inicial de una casilla mediante la función CheckDlgButton , que establece o desactiva la casilla. Para los botones de radio de un grupo de botones de radio mutuamente excluyentes, el procedimiento del cuadro de diálogo puede usar la función CheckRadioButton para establecer el botón de radio adecuado y borrar automáticamente cualquier otro botón de radio.

Antes de que finalice un cuadro de diálogo, el procedimiento del cuadro de diálogo puede activar el estado de cada botón de radio y casilla mediante la función IsDlgButtonChecked , que devuelve el estado actual del botón. Normalmente, un cuadro de diálogo guarda esta información para inicializar los botones la próxima vez que cree el cuadro de diálogo.

Controles de edición del cuadro de diálogo

Muchos cuadros de diálogo tienen controles de edición que permiten al usuario proporcionar texto como entrada. La mayoría de los procedimientos del cuadro de diálogo inicializan un control de edición cuando se inicia por primera vez el cuadro de diálogo. Por ejemplo, el procedimiento del cuadro de diálogo puede colocar un nombre de archivo propuesto en el control que el usuario puede seleccionar, modificar o reemplazar. El procedimiento del cuadro de diálogo puede establecer el texto en un control de edición mediante la función SetDlgItemText , que copia texto de un búfer especificado en el control de edición. Cuando el control de edición recibe el foco de entrada, selecciona automáticamente el texto completo para su edición.

Dado que los controles de edición no devuelven automáticamente su texto al cuadro de diálogo, el procedimiento del cuadro de diálogo debe recuperar el texto antes de que finalice. Puede recuperar el texto mediante la función GetDlgItemText , que copia el texto del control de edición en un búfer. Normalmente, el procedimiento del cuadro de diálogo guarda este texto para inicializar el control de edición más adelante o lo pasa a la ventana primaria para su procesamiento.

Algunos cuadros de diálogo usan controles de edición que permiten al usuario escribir números. El procedimiento del cuadro de diálogo puede recuperar un número de un control de edición mediante la función GetDlgItemInt , que recupera el texto del control de edición y convierte el texto en un valor decimal. El usuario escribe el número en dígitos decimales. Puede ser firmado o sin firmar. El procedimiento del cuadro de diálogo puede mostrar un entero mediante la función SetDlgItemInt . SetDlgItemInt convierte un entero con signo o sin signo en una cadena de dígitos decimales.

Cuadros de lista, cuadros combinados y descripciones de directorios

Algunos cuadros de diálogo muestran listas de nombres de los que el usuario puede seleccionar uno o varios nombres. Para mostrar una lista de nombres de archivo, por ejemplo, un cuadro de diálogo normalmente usa un cuadro de lista y las funciones DlgDirList y DlgDirSelectEx . La función DlgDirList rellena automáticamente un cuadro de lista con los nombres de archivo del directorio actual. La función DlgDirSelect recupera el nombre de archivo seleccionado del cuadro de lista. Juntas, estas dos funciones proporcionan una manera cómoda de que un cuadro de diálogo muestre una lista de directorios para que el usuario pueda seleccionar un archivo sin tener que escribir su nombre y ubicación.

Un cuadro de diálogo también puede usar un cuadro combinado para mostrar una lista de nombres de archivo. La función DlgDirListComboBox rellena automáticamente una parte del cuadro de lista del cuadro combinado con los nombres de archivo del directorio actual. La función DlgDirSelectComboBoxEx recupera un nombre de archivo seleccionado de la parte del cuadro de lista.

Mensajes de control del cuadro de diálogo

Muchos controles reconocen mensajes predefinidos que, cuando los reciben los controles, hacen que realicen alguna acción. Por ejemplo, el mensaje de BM_SETCHECK establece la casilla de verificación y el mensaje de EM_GETSEL recupera la parte del texto del control seleccionado actualmente. Los mensajes de control proporcionan un procedimiento de diálogo mayor y más flexible acceso a los controles que las funciones estándar, por lo que a menudo se usan cuando el cuadro de diálogo requiere interacciones complejas con el usuario.

Un procedimiento de cuadro de diálogo puede enviar un mensaje a un control proporcionando el identificador de control y usando la función SendDlgItemMessage , que es idéntica a la función SendMessage , salvo que usa un identificador de control en lugar de un identificador de ventana para identificar el control que va a recibir el mensaje. Un mensaje especificado puede requerir que el procedimiento de diálogo envíe parámetros con el mensaje y que el mensaje tenga los valores devueltos correspondientes. La operación y los requisitos de cada mensaje de control dependen del propósito del mensaje y del control que lo procesa.

Para obtener más información sobre los mensajes de control, vea Controles de Windows.

Cuadros de diálogo personalizados

Una aplicación puede crear cuadros de diálogo personalizados mediante una clase de ventana definida por la aplicación para los cuadros de diálogo en lugar de usar la clase de cuadro de diálogo predefinida. Las aplicaciones suelen usar este método cuando un cuadro de diálogo es su ventana principal, pero también resulta útil para crear cuadros de diálogo modales y modeless para aplicaciones que tienen ventanas superpuestas estándar.

La clase de ventana definida por la aplicación permite a la aplicación definir un procedimiento de ventana para el cuadro de diálogo y procesar mensajes antes de enviarlos al procedimiento del cuadro de diálogo. También permite a la aplicación definir un icono de clase, un pincel de fondo de clase y un menú de clase para el cuadro de diálogo. La aplicación debe registrar la clase de ventana antes de intentar crear un cuadro de diálogo y debe proporcionar la plantilla de cuadro de diálogo con el valor atom o el nombre de la clase de ventana.

Muchas aplicaciones crean una nueva clase de cuadro de diálogo recuperando primero la información de clase de la clase de cuadro de diálogo predefinida y pasándola a la función GetClassInfo , que rellena una estructura WNDCLASS con la información. La aplicación modifica los miembros individuales de la estructura, como el nombre de clase, el pincel y el icono, y, a continuación, registra la nueva clase mediante la función RegisterClass . Si una aplicación rellena la estructura WNDCLASS por sí sola, debe establecer el miembro cbWndExtra en DLGWINDOWEXTRA, que es el número de bytes adicionales que requiere el sistema para cada cuadro de diálogo. Si una aplicación también usa bytes adicionales para cada cuadro de diálogo, deben estar más allá de los bytes adicionales requeridos por el sistema.

El procedimiento de ventana del cuadro de diálogo personalizado tiene los mismos parámetros y requisitos que cualquier otro procedimiento de ventana. Sin embargo, a diferencia de otros procedimientos de ventana, el procedimiento de ventana de este cuadro de diálogo debe llamar a la función DefDlgProc en lugar de la función DefWindowProc para los mensajes que no procesa. DefDlgProc lleva a cabo el mismo procesamiento de mensajes predeterminado que el procedimiento de ventana para el cuadro de diálogo predefinido, que incluye llamar al procedimiento del cuadro de diálogo.

Una aplicación también puede crear cuadros de diálogo personalizados mediante la subclase del procedimiento de ventana del cuadro de diálogo predefinido. La función SetWindowLong permite a una aplicación especificar el procedimiento de ventana para una ventana especificada. La aplicación también puede intentar subclase mediante la función SetClassLong , pero hacerlo afecta a todos los cuadros de diálogo del sistema, no solo a los que pertenecen a la aplicación.

Las aplicaciones que crean cuadros de diálogo personalizados a veces proporcionan una interfaz de teclado alternativa para los cuadros de diálogo. En el caso de los cuadros de diálogo modeless, esto puede significar que la aplicación no llama a la función IsDialogMessage y, en su lugar, procesa toda la entrada de teclado en el procedimiento de ventana personalizada. En tales casos, la aplicación puede usar el mensaje WM_NEXTDLGCTL para minimizar el código necesario para mover el foco de entrada de un control a otro. Este mensaje, cuando se pasa a DefDlgProc, mueve el foco de entrada a un control especificado y actualiza la apariencia de los controles, como mover el borde predeterminado del botón de inserción o establecer un botón de radio automático.