cuadros de diálogo Acerca de

Hay muchas funciones, mensajes y controles predefinidos para ayudar a crear y administrar cuadros de diálogo, lo que facilita el desarrollo de la interfaz de usuario para una aplicación. En esta introducción se describen las funciones y los mensajes del cuadro de diálogo y se explica cómo usarlos para crear y usar cuadros de diálogo.

Esta información general incluye los temas siguientes:

Para obtener más información sobre los cuadros de diálogo comunes, vea Biblioteca de cuadros de diálogo comunes.

Cuándo usar un cuadro de diálogo

La mayoría de las aplicaciones usan cuadros de diálogo para solicitar información adicional sobre los elementos de menú que requieren la entrada del usuario. El uso de un cuadro de diálogo es la única manera recomendada para que una aplicación recupere la entrada. Por ejemplo, un elemento de menú Abrir típico requiere que se abra el nombre de un archivo, por lo que una aplicación debe usar un cuadro de diálogo para solicitar al usuario el nombre. En tales casos, la aplicación crea el cuadro de diálogo cuando el usuario hace clic en el elemento de menú y destruye el cuadro de diálogo inmediatamente después de que el usuario proporciona la información.

Muchas aplicaciones también usan cuadros de diálogo para mostrar información o opciones mientras el usuario trabaja en otra ventana. Por ejemplo, las aplicaciones de procesamiento de texto suelen usar un cuadro de diálogo con una opción de búsqueda de texto. Mientras la aplicación busca el texto, el cuadro de diálogo permanece en la pantalla. A continuación, el usuario puede volver al cuadro de diálogo y buscar la misma palabra de nuevo; o el usuario puede cambiar la entrada en el cuadro de diálogo y buscar una palabra nueva. Las aplicaciones que usan cuadros de diálogo de esta manera suelen crear una cuando el usuario hace clic en el elemento de menú y continúa mostrándola mientras la aplicación se ejecute o hasta que el usuario cierre explícitamente el cuadro de diálogo.

Para admitir las distintas formas en que las aplicaciones usan cuadros de diálogo, hay dos tipos de cuadros de diálogo: modal y modeless. Un cuadro de diálogo modal requiere que el usuario proporcione información o cancele el cuadro de diálogo antes de permitir que la aplicación continúe. Las aplicaciones usan cuadros de diálogo modales junto con elementos de menú que requieren información adicional para poder continuar. Un cuadro de diálogo modela permite al usuario proporcionar información y volver a la tarea anterior sin cerrar el cuadro de diálogo. Los cuadros de diálogo modales son más sencillos de administrar que los cuadros de diálogo modelados porque se crean, realizan su tarea y se destruyen llamando a una sola función.

Para crear un cuadro de diálogo modal o modeless, una aplicación debe proporcionar una plantilla de cuadro de diálogo para describir el estilo y el contenido del cuadro de diálogo; La aplicación también debe proporcionar un procedimiento de cuadro de diálogo para llevar a cabo tareas. La plantilla del cuadro de diálogo es una descripción binaria del cuadro de diálogo y los controles que contiene. El desarrollador puede crear esta plantilla como un recurso que se va a cargar desde el archivo ejecutable de la aplicación o crear en memoria mientras se ejecuta la aplicación. El procedimiento del cuadro de diálogo es una función de devolución de llamada definida por la aplicación a la que el sistema llama cuando tiene entrada para el cuadro de diálogo o las tareas que debe llevar a cabo el cuadro de diálogo. Aunque un procedimiento de cuadro de diálogo es similar a un procedimiento de ventana, no tiene las mismas responsabilidades.

Normalmente, una aplicación crea un cuadro de diálogo mediante la función DialogBox o CreateDialog . DialogBox crea un cuadro de diálogo modal; CreateDialog crea un cuadro de diálogo modeless. Estas dos funciones cargan una plantilla de cuadro de diálogo desde el archivo ejecutable de la aplicación y crean una ventana emergente que coincida con las especificaciones de la plantilla. Hay otras funciones que crean un cuadro de diálogo mediante plantillas en memoria; pasan información adicional al procedimiento del cuadro de diálogo a medida que se crea el cuadro de diálogo.

Normalmente, los cuadros de diálogo pertenecen a una clase de ventana exclusiva predefinida. El sistema usa esta clase de ventana y su procedimiento de ventana correspondiente para los cuadros de diálogo modales y modeless. Cuando se llama a la función, crea la ventana para el cuadro de diálogo, así como las ventanas de los controles del cuadro de diálogo y, a continuación, envía mensajes seleccionados al procedimiento del cuadro de diálogo. Mientras el cuadro de diálogo está visible, el procedimiento de ventana predefinido administra todos los mensajes, procesando algunos mensajes y pasando otros al procedimiento del cuadro de diálogo para que el procedimiento pueda llevar a cabo tareas. Las aplicaciones no tienen acceso directo a la clase de ventana predefinida o al procedimiento de ventana, pero pueden usar la plantilla de cuadro de diálogo y el procedimiento de cuadro de diálogo para modificar el estilo y el comportamiento de un cuadro de diálogo.

Ventana Propietario del cuadro de diálogo

La mayoría de los cuadros de diálogo tienen una ventana de propietario (o más simplemente, un propietario). Al crear el cuadro de diálogo, la aplicación establece el propietario especificando el identificador de ventana del propietario. El sistema usa el propietario para determinar la posición del cuadro de diálogo en el orden Z para que el cuadro de diálogo siempre se coloque encima de su propietario. Además, el sistema puede enviar mensajes al procedimiento de ventana del propietario, notificándolo de eventos en el cuadro de diálogo.

El sistema oculta o destruye automáticamente el cuadro de diálogo siempre que su propietario esté oculto o destruido. Esto significa que el procedimiento del cuadro de diálogo no requiere ningún procesamiento especial para detectar cambios en el estado de la ventana del propietario.

Dado que el cuadro de diálogo típico se usa junto con un elemento de menú, la ventana del propietario suele ser la ventana que contiene el menú. Aunque es posible crear un cuadro de diálogo que no tenga propietario, no se recomienda. Por ejemplo, cuando un cuadro de diálogo modal no tiene propietario, el sistema no deshabilita ninguna de las demás ventanas de la aplicación y permite al usuario seguir realizando el trabajo en las otras ventanas, lo que anula el propósito del cuadro de diálogo modal.

Cuando un cuadro de diálogo modelado no tiene propietario, el sistema no oculta ni destruye el cuadro de diálogo cuando otras ventanas de la aplicación están ocultas o destruidas. Aunque esto no anula el propósito del cuadro de diálogo modeless, requiere que la aplicación lleve a cabo un procesamiento especial para asegurarse de que el cuadro de diálogo está oculto y destruido en los momentos adecuados.

Cuadros de mensaje

Un cuadro de mensaje es un cuadro de diálogo especial que una aplicación puede usar para mostrar mensajes y solicitar una entrada sencilla. Normalmente, un cuadro de mensaje contiene un mensaje de texto y uno o varios botones. Una aplicación crea el cuadro de mensaje mediante la función MessageBox o MessageBoxEx , especificando el texto y el número y los tipos de botones que se van a mostrar. Tenga en cuenta que actualmente no hay ninguna diferencia entre el funcionamiento de MessageBox y MessageBoxEx .

Aunque el cuadro de mensaje es un cuadro de diálogo, el sistema controla completamente la creación y administración del cuadro de mensaje. Esto significa que la aplicación no proporciona una plantilla de cuadro de diálogo y un procedimiento de cuadro de diálogo. El sistema crea su propia plantilla en función del texto y los botones especificados para el cuadro de mensaje y proporciona su propio procedimiento de cuadro de diálogo.

Un cuadro de mensaje es un cuadro de diálogo modal y el sistema lo crea mediante las mismas funciones internas que usa DialogBox . Si la aplicación especifica una ventana de propietario al llamar a MessageBox o MessageBoxEx, el sistema deshabilita el propietario. Una aplicación también puede dirigir al sistema para deshabilitar todas las ventanas de nivel superior que pertenecen al subproceso actual especificando el valor MB_TASKMODAL al crear el cuadro de diálogo.

El sistema puede enviar mensajes al propietario, como WM_CANCELMODE y WM_ENABLE, tal como hace al crear un cuadro de diálogo modal. La ventana del propietario debe llevar a cabo las acciones solicitadas por estos mensajes.

Un cuadro de diálogo modal debe ser una ventana emergente con un menú de ventana, una barra de título y un borde grueso; es decir, la plantilla del cuadro de diálogo debe especificar los estilos WS_POPUP, WS_SYSMENU, WS_CAPTION y DS_MODALFRAME . Aunque una aplicación puede designar el estilo de WS_VISIBLE , el sistema siempre muestra un cuadro de diálogo modal independientemente de si la plantilla del cuadro de diálogo especifica el estilo WS_VISIBLE . Una aplicación no debe crear un cuadro de diálogo modal que tenga el estilo WS_CHILD . Un cuadro de diálogo modal con este estilo se deshabilita, lo que impide que cualquier entrada posterior llegue a la aplicación.

Una aplicación crea un cuadro de diálogo modal mediante la función DialogBox o DialogBoxIndirect . DialogBox requiere el nombre o identificador de un recurso que contiene una plantilla de cuadro de diálogo; DialogBoxIndirect requiere un identificador para un objeto de memoria que contiene una plantilla de cuadro de diálogo. Las funciones DialogBoxParam y DialogBoxIndirectParam también crean cuadros de diálogo modales; son idénticos a las funciones mencionadas anteriormente, pero pasan un parámetro especificado al procedimiento del cuadro de diálogo cuando se crea el cuadro de diálogo.

Al crear el cuadro de diálogo modal, el sistema lo convierte en la ventana activa. El cuadro de diálogo permanece activo hasta que el procedimiento del cuadro de diálogo llama a la función EndDialog o el sistema activa una ventana en otra aplicación. Ni el usuario ni la aplicación pueden activar la ventana del propietario hasta que se destruye el cuadro de diálogo modal.

Cuando la ventana del propietario aún no está deshabilitada, el sistema deshabilita automáticamente la ventana y las ventanas secundarias que pertenecen a ella cuando crea el cuadro de diálogo modal. La ventana del propietario permanece deshabilitada hasta que se destruye el cuadro de diálogo. Aunque un procedimiento de cuadro de diálogo podría habilitar la ventana de propietario en cualquier momento, la habilitación del propietario anula el propósito del cuadro de diálogo modal y no se recomienda. Cuando se destruye el procedimiento del cuadro de diálogo, el sistema vuelve a habilitar la ventana del propietario, pero solo si el cuadro de diálogo modal hace que el propietario se deshabilite.

A medida que el sistema crea el cuadro de diálogo modal, envía el mensaje WM_CANCELMODE a la ventana (si existe) que captura actualmente la entrada del mouse. Una aplicación que recibe este mensaje debe liberar la captura del mouse para que el usuario pueda mover el mouse en el cuadro de diálogo modal. Dado que el sistema deshabilita la ventana del propietario, se pierde toda la entrada del mouse si el propietario no puede liberar el mouse al recibir este mensaje.

Para procesar mensajes para el cuadro de diálogo modal, el sistema inicia su propio bucle de mensajes, tomando el control temporal de la cola de mensajes para toda la aplicación. Cuando el sistema recupera un mensaje que no es explícitamente para el cuadro de diálogo, envía el mensaje a la ventana adecuada. Si recupera un mensaje de WM_QUIT , devuelve el mensaje a la cola de mensajes de la aplicación para que el bucle de mensajes principal de la aplicación pueda recuperar el mensaje.

El sistema envía el mensaje WM_ENTERIDLE a la ventana del propietario cada vez que la cola de mensajes de la aplicación está vacía. La aplicación puede usar este mensaje para llevar a cabo una tarea en segundo plano mientras el cuadro de diálogo permanece en la pantalla. Cuando una aplicación usa el mensaje de esta manera, la aplicación debe producir con frecuencia el control (por ejemplo, mediante la función PeekMessage ) para que el cuadro de diálogo modal pueda recibir cualquier entrada del usuario. Para evitar que el cuadro de diálogo modal envíe los mensajes de WM_ENTERIDLE , la aplicación puede especificar el estilo DS_NOIDLEMSG al crear el cuadro de diálogo.

Una aplicación destruye un cuadro de diálogo modal mediante la función EndDialog . En la mayoría de los casos, el procedimiento del cuadro de diálogo llama a EndDialog cuando el usuario hace clic en Cerrar desde el menú de la ventana del cuadro de diálogo o hace clic en el botón Aceptar o Cancelar del cuadro de diálogo. El cuadro de diálogo puede devolver un valor a través de la función DialogBox (u otras funciones de creación) especificando un valor al llamar a la función EndDialog . El sistema devuelve este valor después de destruir el cuadro de diálogo. La mayoría de las aplicaciones usan este valor devuelto para determinar si el cuadro de diálogo completó correctamente su tarea o si el usuario lo canceló. El sistema no devuelve el control de la función que crea el cuadro de diálogo hasta que el procedimiento del cuadro de diálogo haya llamado a la función EndDialog .

Cuadros de diálogo Modeless

Un cuadro de diálogo modelado debe ser una ventana emergente con un menú de ventana, una barra de título y un borde fino; Es decir, la plantilla del cuadro de diálogo debe especificar los estilos WS_POPUP, WS_CAPTION, WS_BORDER y WS_SYSMENU . El sistema no muestra automáticamente el cuadro de diálogo a menos que la plantilla especifique el estilo WS_VISIBLE .

Una aplicación crea un cuadro de diálogo modeless mediante la función CreateDialog o CreateDialogIndirect . CreateDialog requiere el nombre o identificador de un recurso que contiene una plantilla de cuadro de diálogo; CreateDialogIndirect requiere un identificador para un objeto de memoria que contiene una plantilla de cuadro de diálogo. Otras dos funciones, CreateDialogParam y CreateDialogIndirectParam, también crean cuadros de diálogo modeless; pasan un parámetro especificado al procedimiento del cuadro de diálogo cuando se crea el cuadro de diálogo.

CreateDialog y otras funciones de creación devuelven un identificador de ventana al cuadro de diálogo. La aplicación y el procedimiento del cuadro de diálogo pueden usar este identificador para administrar el cuadro de diálogo. Por ejemplo, si no se especifica WS_VISIBLE en la plantilla de cuadro de diálogo, la aplicación puede mostrar el cuadro de diálogo pasando el identificador de ventana a la función ShowWindow .

Un cuadro de diálogo modela no deshabilita la ventana del propietario ni envía mensajes a él. Al crear el cuadro de diálogo, el sistema lo convierte en la ventana activa, pero el usuario o la aplicación pueden cambiar la ventana activa en cualquier momento. Si el cuadro de diálogo se vuelve inactivo, permanece encima de la ventana del propietario en el orden Z, incluso si la ventana del propietario está activa.

La aplicación es responsable de recuperar y enviar mensajes de entrada al cuadro de diálogo. La mayoría de las aplicaciones usan el bucle de mensajes principal para esto. Sin embargo, para permitir que el usuario se mueva y seleccione los controles mediante el teclado, la aplicación debe llamar a la función IsDialogMessage . Para obtener más información sobre esta función, vea Interfaz de teclado de cuadro de diálogo.

Un cuadro de diálogo modela no puede devolver un valor a la aplicación como un cuadro de diálogo modal, pero el procedimiento del cuadro de diálogo puede enviar información a la ventana del propietario mediante la función SendMessage .

Una aplicación debe destruir todos los cuadros de diálogo modeless antes de finalizar. Puede destruir un cuadro de diálogo modelado mediante la función DestroyWindow . En la mayoría de los casos, el procedimiento del cuadro de diálogo llama a DestroyWindow en respuesta a la entrada del usuario, como hacer clic en el botón Cancelar . Si el usuario nunca cierra el cuadro de diálogo de esta manera, la aplicación debe llamar a DestroyWindow.

DestroyWindow invalida el identificador de ventana en el cuadro de diálogo, por lo que las llamadas posteriores a las funciones que usan los valores de error devueltos por el identificador. Para evitar errores, el procedimiento del cuadro de diálogo debe notificar al propietario que se ha destruido el cuadro de diálogo. Muchas aplicaciones mantienen una variable global que contiene el identificador en el cuadro de diálogo. Cuando el procedimiento del cuadro de diálogo destruye el cuadro de diálogo, también establece la variable global en NULL, lo que indica que el cuadro de diálogo ya no es válido.

El procedimiento del cuadro de diálogo no debe llamar a la función EndDialog para destruir un cuadro de diálogo modeless.

Plantillas de cuadro de diálogo

Una plantilla de cuadro de diálogo es datos binarios que describen el cuadro de diálogo, que define su alto, ancho, estilo y los controles que contiene. Para crear un cuadro de diálogo, el sistema carga una plantilla de cuadro de diálogo de los recursos del archivo ejecutable de la aplicación o usa la plantilla que la aplicación le pasa en memoria global. En cualquier caso, la aplicación debe proporcionar una plantilla al crear un cuadro de diálogo.

Un desarrollador crea recursos de plantilla mediante un compilador de recursos o un editor de cuadros de diálogo. Un compilador de recursos convierte una descripción de texto en un recurso binario y un editor de cuadros de diálogo guarda un cuadro de diálogo construido interactivamente como un recurso binario.

Nota

Una explicación de cómo crear recursos de plantilla y agregarlos al archivo ejecutable de la aplicación está fuera del ámbito de esta información general. Para obtener más información sobre cómo crear recursos de plantilla y agregarlos a un archivo ejecutable, consulte la documentación proporcionada con las herramientas de desarrollo de aplicaciones.

 

Para crear un cuadro de diálogo sin usar recursos de plantilla, debe crear una plantilla en memoria y pasarla a la función CreateDialogIndirectParam o DialogBoxIndirectParam , o a la macro CreateDialogIndirect o DialogBoxIndirect .

Una plantilla de cuadro de diálogo en memoria consta de un encabezado que describe el cuadro de diálogo, seguido de uno o varios bloques adicionales de datos que describen cada uno de los controles del cuadro de diálogo. La plantilla puede usar el formato estándar o el formato extendido. En una plantilla estándar, el encabezado es una estructura DLGTEMPLATE seguida de matrices de longitud variable adicionales; y los datos de cada control constan de una estructura DLGITEMTEMPLATE seguida de matrices de longitud variable adicionales. En una plantilla de cuadro de diálogo extendido, el encabezado usa el formato DLGTEMPLATEEX y las definiciones de control usan el formato DLGITEMTEMPLATEEX .

Puede crear una plantilla de memoria asignando un objeto de memoria global y rellenándolo con las definiciones de encabezado y control estándar o extendidas. Una plantilla de memoria es idéntica en forma y contenido a un recurso de plantilla. Muchas aplicaciones que usan plantillas de memoria usan primero la función LoadResource para cargar un recurso de plantilla en la memoria y, a continuación, modificar el recurso cargado para crear una nueva plantilla de memoria. Para obtener más información sobre cómo crear una plantilla de cuadro de diálogo en memoria, vea Plantillas en memoria.

En las secciones siguientes se describen los estilos, las medidas y otros valores usados en una plantilla de cuadro de diálogo.

Estilos de plantilla del cuadro de diálogo

Cada plantilla de cuadro de diálogo especifica una combinación de valores de estilo que definen la apariencia y las características del cuadro de diálogo. Los valores de estilo pueden ser estilos de ventana, como WS_POPUP y WS_SYSMENU, y estilos de cuadro de diálogo, como DS_MODALFRAME. El número y el tipo de estilos de una plantilla dependen del tipo y propósito del cuadro de diálogo. Para obtener una lista de valores, vea Estilos de cuadro de diálogo.

El sistema pasa todos los estilos de ventana especificados en la plantilla a la función CreateWindowEx al crear el cuadro de diálogo. El sistema puede pasar uno o varios estilos extendidos en función de los estilos de cuadro de diálogo especificados. Por ejemplo, cuando la plantilla especifica DS_MODALFRAME, el sistema usa WS_EX_DLGMODALFRAME al crear el cuadro de diálogo.

La mayoría de los cuadros de diálogo son ventanas emergentes que tienen un menú de ventana y una barra de título. Por lo tanto, la plantilla típica especifica los estilos WS_POPUP, WS_SYSMENU y WS_CAPTION . La plantilla también especifica un estilo de borde: WS_BORDER para los cuadros de diálogo modelados y DS_MODALFRAME para los cuadros de diálogo modales. Una plantilla puede especificar un tipo de ventana distinto de un elemento emergente (como WS_OVERLAPPED) si crea una ventana personalizada en lugar de un cuadro de diálogo.

El sistema siempre muestra un cuadro de diálogo modal independientemente de si se especifica el estilo WS_VISIBLE . Cuando la plantilla de un cuadro de diálogo modeless especifica el estilo WS_VISIBLE , el sistema muestra automáticamente el cuadro de diálogo cuando se crea. De lo contrario, la aplicación es responsable de mostrar el cuadro de diálogo mediante la función ShowWindow .

Medidas del cuadro de diálogo

Cada plantilla de cuadro de diálogo contiene medidas que especifican la posición, el ancho y el alto del cuadro de diálogo y los controles que contiene. Estas medidas son independientes del dispositivo, por lo que una aplicación puede usar una sola plantilla para crear el mismo cuadro de diálogo para todos los tipos de dispositivos de visualización. Esto garantiza que un cuadro de diálogo tenga las mismas proporciones y apariencias en todas las pantallas, a pesar de diferentes resoluciones y relaciones de aspecto entre pantallas.

Las medidas de una plantilla de cuadro de diálogo se especifican en unidades de plantilla de diálogo. Para convertir medidas de unidades de plantilla de diálogo en unidades de pantalla (píxeles), use la función MapDialogRect , que tiene en cuenta la fuente utilizada por el cuadro de diálogo y convierte correctamente un rectángulo de unidades de plantilla de diálogo en píxeles. Para los cuadros de diálogo que usan la fuente del sistema, puede usar la función GetDialogBaseUnits para realizar los cálculos de conversión usted mismo, aunque el uso de MapDialogRect es más sencillo.

La plantilla debe especificar las coordenadas iniciales de la esquina superior izquierda del cuadro de diálogo. Normalmente, las coordenadas son relativas a la esquina superior izquierda del área de cliente de la ventana del propietario. Cuando la plantilla especifica el estilo DS_ABSALIGN o el cuadro de diálogo no tiene propietario, la posición es relativa a la esquina superior izquierda de la pantalla. El sistema establece esta posición inicial al crear el cuadro de diálogo, pero permite que una aplicación ajuste la posición antes de mostrar el cuadro de diálogo. Por ejemplo, una aplicación puede recuperar las dimensiones de la ventana del propietario, calcular una nueva posición que centra el cuadro de diálogo en la ventana del propietario y, a continuación, establecer la posición mediante la función SetWindowPos .

La plantilla debe especificar un ancho y alto de cuadro de diálogo que no supere el ancho y el alto de la pantalla, y garantiza que todos los controles estén dentro del área cliente del cuadro de diálogo. Aunque el sistema permite que un cuadro de diálogo sea de cualquier tamaño, la creación de una que sea demasiado pequeña o demasiado grande puede impedir que el usuario proporcione entradas, lo que anula el propósito del cuadro de diálogo. Muchas aplicaciones usan más de un cuadro de diálogo cuando hay un gran número de controles. En tales casos, el cuadro de diálogo inicial normalmente contiene uno o varios botones que el usuario puede elegir para mostrar el siguiente cuadro de diálogo.

Controles de cuadro de diálogo

La plantilla especifica la posición, el ancho, el alto, el estilo, el identificador y la clase de ventana para cada control del cuadro de diálogo. El sistema crea cada control pasando estos datos a la función CreateWindowEx . Los controles se crean en el orden en que se especifican en la plantilla. La plantilla debe especificar el número, el tipo y el orden adecuados de los controles para asegurarse de que el usuario pueda escribir la entrada necesaria para completar la tarea asociada al cuadro de diálogo.

Para cada control, la plantilla especifica valores de estilo que definen la apariencia y el funcionamiento del control. Cada control es una ventana secundaria y, por lo tanto, debe tener el estilo WS_CHILD . Para asegurarse de que el control está visible cuando se muestra el cuadro de diálogo, cada control también debe tener el estilo WS_VISIBLE . Otros estilos de ventana usados habitualmente son WS_BORDER para los controles que tienen bordes opcionales, WS_DISABLED para los controles que deben deshabilitarse cuando se crea inicialmente el cuadro de diálogo, y WS_TABSTOP y WS_GROUP para los controles a los que se puede acceder mediante el teclado. Los estilos WS_TABSTOP y WS_GROUP se usan junto con la interfaz de teclado del cuadro de diálogo descrita más adelante en este tema.

La plantilla también puede especificar estilos de control específicos de la clase de ventana del control. Por ejemplo, una plantilla que especifica un control de botón debe proporcionar un estilo de control de botón, como BS_PUSHBUTTON o BS_CHECKBOX. El sistema pasa los estilos de control al procedimiento de la ventana de control a través del mensaje WM_CREATE , lo que permite al procedimiento adaptar la apariencia y el funcionamiento del control.

El sistema convierte las coordenadas de posición y las medidas de ancho y alto de unidades base de diálogo en píxeles, antes de pasarlas a CreateWindowEx. Cuando el sistema crea un control, especifica el cuadro de diálogo como la ventana primaria. Esto significa que el sistema siempre interpreta las coordenadas de posición del control como coordenadas de cliente, en relación con la esquina superior izquierda del área de cliente del cuadro de diálogo.

La plantilla especifica la clase de ventana para cada control. Un cuadro de diálogo típico contiene controles que pertenecen a las clases de ventana de control predefinidas, como el botón y editar clases de ventana de control. En este caso, la plantilla especifica clases de ventana proporcionando los valores atom predefinidos correspondientes para las clases. Cuando un cuadro de diálogo contiene un control que pertenece a una clase de ventana de control personalizada, la plantilla proporciona el nombre de esa clase de ventana registrada o el valor atom asociado actualmente al nombre.

Cada control de un cuadro de diálogo debe tener un identificador único para distinguirlo de otros controles. Los controles envían información al procedimiento del cuadro de diálogo a través de WM_COMMAND mensajes, por lo que los identificadores de control son esenciales para el procedimiento para determinar qué control envió un mensaje especificado. La única excepción a esta regla son identificadores de control para controles estáticos. Los controles estáticos no requieren identificadores únicos porque no envían mensajes WM_COMMAND .

Para permitir que el usuario cierre el cuadro de diálogo, la plantilla debe especificar al menos un botón de inserción y darle el identificador de control IDCANCEL. Para permitir que el usuario elija entre completar o cancelar la tarea asociada al cuadro de diálogo, la plantilla debe especificar dos botones de inserción, etiquetados como Aceptar y Cancelar, con identificadores de control de IDOK y IDCANCEL, respectivamente.

Una plantilla también especifica datos opcionales de texto y creación para un control. El texto normalmente proporciona etiquetas para los controles de botón o especifica el contenido inicial de un control de texto estático. Los datos de creación son uno o varios bytes de datos que el sistema pasa al procedimiento de ventana de control al crear el control. Los datos de creación son útiles para los controles que requieren más información sobre su contenido inicial o estilo que los especificados por otros datos. Por ejemplo, una aplicación puede usar datos de creación para establecer la configuración inicial y el intervalo de un control de barra de desplazamiento.

Menú de ventana del cuadro de diálogo

El sistema proporciona un cuadro de diálogo un menú de ventana cuando la plantilla especifica el estilo WS_SYSMENU . Para evitar entradas inapropiadas, el sistema deshabilita automáticamente todos los elementos del menú excepto Mover y Cerrar. El usuario puede hacer clic en Mover para mover el cuadro de diálogo. Cuando el usuario hace clic en Cerrar, el sistema envía un mensaje WM_COMMAND al procedimiento del cuadro de diálogo con el parámetro wParam establecido en IDCANCEL. Esto es idéntico al mensaje enviado por el botón Cancelar cuando el usuario hace clic en él. La acción recomendada para este mensaje es cerrar el cuadro de diálogo y cancelar la tarea solicitada.

Aunque no se recomiendan otros menús en los cuadros de diálogo, una plantilla de cuadro de diálogo puede especificar un menú proporcionando el identificador o el nombre de un recurso de menú. En este caso, el sistema carga el recurso y crea el menú del cuadro de diálogo. Las aplicaciones suelen usar identificadores de menú o nombres en plantillas al usar las plantillas para crear ventanas personalizadas en lugar de cuadros de diálogo.

Fuentes del cuadro de diálogo

El sistema usa el ancho medio de caracteres de la fuente del cuadro de diálogo para calcular la posición y las dimensiones del cuadro de diálogo. De forma predeterminada, el sistema dibuja todo el texto de un cuadro de diálogo con la fuente SYSTEM_FONT .

Para especificar una fuente para un cuadro de diálogo distinto del valor predeterminado, debe crear el cuadro de diálogo mediante una plantilla de cuadro de diálogo. En un recurso de plantilla, use la instrucción FONT. En una plantilla de cuadro de diálogo, establezca el estilo DS_SETFONT o DS_SHELLFONT y especifique un tamaño de punto y un nombre de tipo de letra. Incluso si una plantilla de cuadro de diálogo especifica una fuente de esta manera, el sistema siempre usa la fuente del sistema para los menús de título y cuadro de diálogo del cuadro de diálogo.

Cuando el cuadro de diálogo tiene el estilo DS_SETFONT o DS_SHELLFONT , el sistema envía un mensaje WM_SETFONT al procedimiento del cuadro de diálogo y a cada control a medida que crea el control. El procedimiento del cuadro de diálogo es responsable de guardar el identificador de fuente pasado con el mensaje WM_SETFONT y seleccionar el identificador en el contexto del dispositivo para mostrar cada vez que escribe texto en la ventana. Los controles predefinidos lo hacen de forma predeterminada.

La fuente del sistema puede variar entre diferentes versiones de Windows. Para que la aplicación use la fuente del sistema independientemente del sistema en el que se ejecute, use DS_SHELLFONT con la letra de letra MS Shell Dlg y use el recurso DIALOGEX en lugar del recurso DIALOG. El sistema asigna este tipo de letra de modo que el cuadro de diálogo usará la fuente Tahoma. Tenga en cuenta que DS_SHELLFONT no tiene ningún efecto si el tipo de letra no es MS Shell Dlg.

Plantillas en memoria

Una plantilla de cuadro de diálogo en memoria consta de un encabezado que describe el cuadro de diálogo, seguido de uno o varios bloques adicionales de datos que describen cada uno de los controles del cuadro de diálogo. La plantilla puede usar el formato estándar o el formato extendido. En una plantilla estándar, el encabezado es una estructura DLGTEMPLATE seguida de matrices de longitud variable adicionales. Los datos de cada control constan de una estructura DLGITEMTEMPLATE seguida de matrices de longitud variable adicionales. En una plantilla de cuadro de diálogo extendido, el encabezado usa el formato DLGTEMPLATEEX y las definiciones de control usan el formato DLGITEMTEMPLATEEX .

Para distinguir entre una plantilla estándar y una plantilla extendida, compruebe los primeros 16 bits de una plantilla de cuadro de diálogo. En una plantilla extendida, la primera PALABRA es 0xFFFF; cualquier otro valor indica una plantilla estándar.

Si crea una plantilla de diálogo en memoria, debe asegurarse de que cada una de las definiciones de control DLGITEMTEMPLATE o DLGITEMTEMPLATEEX se alinean en los límites de DWORD . Además, los datos de creación que siguen a una definición de control deben alinearse en un límite DWORD . Todas las demás matrices de longitud variable de una plantilla de cuadro de diálogo deben alinearse en los límites de WORD .

Encabezado de plantilla

En las plantillas estándar y extendidas para los cuadros de diálogo, el encabezado incluye la siguiente información general:

  • Ubicación y dimensiones del cuadro de diálogo
  • Estilos de ventana y cuadro de diálogo para el cuadro de diálogo
  • Número de controles del cuadro de diálogo. Este valor determina el número de definiciones de control DLGITEMTEMPLATE o DLGITEMTEMPLATEEX en la plantilla.
  • Un recurso de menú opcional para el cuadro de diálogo. La plantilla puede indicar que el cuadro de diálogo no tiene un menú o puede especificar un valor ordinal o una cadena Unicode terminada en null que identifica un recurso de menú en un archivo ejecutable.
  • Clase de ventana del cuadro de diálogo. Puede ser la clase de cuadro de diálogo predefinida o un valor ordinal o una cadena Unicode terminada en null que identifica una clase de ventana registrada.
  • Cadena Unicode terminada en null que especifica el título de la ventana del cuadro de diálogo. Si la cadena está vacía, la barra de título del cuadro de diálogo está en blanco. Si el cuadro de diálogo no tiene el estilo WS_CAPTION , el sistema establece el título en la cadena especificada, pero no lo muestra.
  • Si el cuadro de diálogo tiene el estilo DS_SETFONT , el encabezado especifica el tamaño de punto y el nombre del tipo de letra de la fuente que se va a usar para el texto del área de cliente y los controles del cuadro de diálogo.

En una plantilla extendida, el encabezado DLGTEMPLATEEX también especifica la siguiente información adicional:

  • Identificador de contexto de ayuda de la ventana del cuadro de diálogo cuando el sistema envía un mensaje WM_HELP .
  • Si el cuadro de diálogo tiene el estilo DS_SETFONT o DS_SHELLFONT , el encabezado especifica el peso de fuente e indica si la fuente está cursiva.

Definiciones de control

Después del encabezado de plantilla hay una o varias definiciones de control que describen los controles del cuadro de diálogo. En las plantillas estándar y extendidas, el encabezado del cuadro de diálogo tiene un miembro que indica el número de definiciones de control de la plantilla. En una plantilla estándar, cada definición de control consta de una estructura DLGITEMTEMPLATE seguida de matrices de longitud variable adicionales. En una plantilla extendida, las definiciones de control usan el formato DLGITEMTEMPLATEEX .

En las plantillas estándar y extendidas, la definición de control incluye la siguiente información:

  • Ubicación y dimensiones del control.
  • Los estilos de ventana y control para el control.
  • Identificador de control.
  • Clase de ventana del control . Puede ser el valor ordinal de una clase de sistema predefinida o una cadena Unicode terminada en null que especifica el nombre de una clase de ventana registrada.
  • Cadena Unicode terminada en null que especifica el texto inicial del control o un valor ordinal que identifica un recurso, como un icono, en un archivo ejecutable.
  • Bloque opcional de longitud variable de los datos de creación. Cuando el sistema crea el control, pasa un puntero a estos datos en el parámetro lParam del mensaje WM_CREATE que envía al control.

En una plantilla extendida, la definición de control también especifica un identificador de contexto de ayuda para el control cuando el sistema envía un mensaje de WM_HELP .