Acerca de la interfaz de varios documentos

Cada documento de una aplicación de interfaz de varios documentos (MDI) se muestra en una ventana secundaria independiente dentro del área cliente de la ventana principal de la aplicación. Las aplicaciones MDI típicas incluyen aplicaciones de procesamiento de texto que permiten al usuario trabajar con varios documentos de texto y aplicaciones de hoja de cálculo que permiten al usuario trabajar con varios gráficos y hojas de cálculo. Para obtener más información, vea los siguientes temas.

Ventanas de marco, cliente y secundario

Una aplicación MDI tiene tres tipos de ventanas: una ventana de marco, una ventana de cliente MDI, así como una serie de ventanas secundarias. La ventana de marco es como la ventana principal de la aplicación: tiene un borde de tamaño, una barra de título, un menú de ventana, un botón minimizar y un botón maximizar. La aplicación debe registrar una clase de ventana para la ventana de marco y proporcionar un procedimiento de ventana para admitirla.

Una aplicación MDI no muestra la salida en el área cliente de la ventana de marco. En su lugar, muestra la ventana del cliente MDI. Una ventana de cliente MDI es un tipo especial de ventana secundaria que pertenece a la clase MDICLIENT de ventana registrada previamente. La ventana de cliente es un elemento secundario de la ventana de marco; actúa como fondo para ventanas secundarias. También proporciona compatibilidad para crear y manipular ventanas secundarias. Por ejemplo, una aplicación MDI puede crear, activar o maximizar ventanas secundarias mediante el envío de mensajes a la ventana del cliente MDI.

Cuando el usuario abre o crea un documento, la ventana del cliente crea una ventana secundaria para el documento. La ventana de cliente es la ventana primaria de todas las ventanas secundarias MDI de la aplicación. Cada ventana secundaria tiene un borde de ajuste de tamaño, una barra de título, un menú de ventana, un botón minimizar y un botón maximizar. Dado que se recorta una ventana secundaria, se limita a la ventana de cliente y no puede aparecer fuera de ella.

Una aplicación MDI puede admitir más de un tipo de documento. Por ejemplo, una aplicación de hoja de cálculo típica permite al usuario trabajar con gráficos y hojas de cálculo. Para cada tipo de documento que admita, una aplicación MDI debe registrar una clase de ventana secundaria y proporcionar un procedimiento de ventana para admitir las ventanas que pertenecen a esa clase. Para obtener más información sobre las clases de ventana, vea Clases de ventana. Para obtener más información sobre los procedimientos de ventana, vea Procedimientos de ventana.

A continuación se muestra una aplicación MDI típica. Se denomina Multipad.

ventana de marco de aplicación mdi multipad y ventana de cliente

Creación de ventana secundaria

Para crear una ventana secundaria, una aplicación MDI llama a la función CreateMDIWindow o envía el mensaje WM_MDICREATE a la ventana del cliente MDI. Una manera más eficaz de crear una ventana secundaria MDI es llamar a la función CreateWindowEx , especificando el estilo extendido WS_EX_MDICHILD .

Para destruir una ventana secundaria, una aplicación MDI envía un mensaje WM_MDIDESTROY a la ventana del cliente MDI.

Activación de ventana secundaria

Cualquier número de ventanas secundarias puede aparecer en la ventana de cliente en cualquier momento, pero solo se puede activar una. La ventana secundaria activa se coloca delante de todas las demás ventanas secundarias y su borde está resaltado.

El usuario puede activar una ventana secundaria inactiva haciendo clic en ella. Una aplicación MDI activa una ventana secundaria enviando un mensaje WM_MDIACTIVATE a la ventana del cliente MDI. A medida que la ventana de cliente procesa este mensaje, envía un mensaje WM_MDIACTIVATE al procedimiento de ventana de la ventana secundaria que se va a activar y al procedimiento de ventana de la ventana secundaria que se está desactivando.

Para evitar que una ventana secundaria se active, controle el mensaje WM_NCACTIVATE a la ventana secundaria devolviendo FALSE.

El sistema realiza un seguimiento de la posición de cada ventana secundaria en la pila de ventanas superpuestas. Este apilamiento se conoce como Z-Order. El usuario puede activar la siguiente ventana secundaria en el orden Z haciendo clic en Siguiente en el menú de la ventana activa. Una aplicación activa la siguiente ventana secundaria (o anterior) en el orden Z enviando un mensaje WM_MDINEXT a la ventana del cliente.

Para recuperar el identificador de la ventana secundaria activa, la aplicación MDI envía un mensaje WM_MDIGETACTIVE a la ventana del cliente.

Menús de varios documentos

La ventana de marco de una aplicación MDI debe incluir una barra de menús con un menú de ventana. El menú de la ventana debe incluir elementos que organicen las ventanas secundarias dentro de la ventana del cliente o que cierren todas las ventanas secundarias. El menú de ventana de una aplicación MDI típica podría incluir los elementos de la tabla siguiente.

Elemento de menú Propósito
Icono Organiza ventanas secundarias en un formato de icono para que cada una aparezca en su totalidad en la ventana del cliente.
Cascade Organiza ventanas secundarias en un formato en cascada. Las ventanas secundarias se superponen entre sí, pero la barra de título de cada una está visible.
Organizar iconos Organiza los iconos de ventanas secundarias minimizadas a lo largo de la parte inferior de la ventana del cliente.
Cerrar todo Cierra todas las ventanas secundarias.

 

Cada vez que se crea una ventana secundaria, el sistema anexa automáticamente un nuevo elemento de menú al menú de la ventana. El texto del elemento de menú es el mismo que el texto de la barra de menús de la nueva ventana secundaria. Al hacer clic en el elemento de menú, el usuario puede activar la ventana secundaria correspondiente. Cuando se destruye una ventana secundaria, el sistema quita automáticamente el elemento de menú correspondiente del menú de la ventana.

El sistema puede agregar hasta diez elementos de menú al menú de la ventana. Cuando se crea la décima ventana secundaria, el sistema agrega el elemento Más Windows al menú de la ventana. Al hacer clic en este elemento se muestra el cuadro de diálogo Seleccionar ventana . El cuadro de diálogo contiene un cuadro de lista con los títulos de todas las ventanas secundarias MDI disponibles actualmente. El usuario puede activar una ventana secundaria haciendo clic en su título en el cuadro de lista.

Si la aplicación MDI admite varios tipos de ventanas secundarias, adapte la barra de menús para reflejar las operaciones asociadas a la ventana activa. Para ello, proporcione recursos de menú independientes para cada tipo de ventana secundaria que admita la aplicación. Cuando se activa un nuevo tipo de ventana secundaria, la aplicación debe enviar un mensaje WM_MDISETMENU a la ventana del cliente, pasando al identificador al menú correspondiente.

Cuando no existe ninguna ventana secundaria, la barra de menús solo debe contener elementos usados para crear o abrir un documento.

Cuando el usuario navega por los menús de una aplicación MDI mediante teclas de cursor, las teclas se comportan de forma diferente que cuando el usuario navega por los menús de una aplicación típica. En una aplicación MDI, el control pasa desde el menú de la ventana de la aplicación al menú de ventana de la ventana secundaria activa y, a continuación, al primer elemento de la barra de menús.

Varios aceleradores de documentos

Para recibir y procesar teclas de aceleración para sus ventanas secundarias, una aplicación MDI debe incluir la función TranslateMDISysAccel en su bucle de mensajes. El bucle debe llamar a TranslateMDISysAccel antes de llamar a la función TranslateAccelerator o DispatchMessage .

Las teclas de aceleración del menú de la ventana de una ventana secundaria MDI son diferentes de las de una ventana secundaria que no sea MDI. En una ventana secundaria MDI, la combinación de teclas ALT+ – (menos) abre el menú de la ventana, la combinación de teclas CTRL+F4 cierra la ventana secundaria activa y la combinación de teclas CTRL+F6 activa la siguiente ventana secundaria.

Tamaño y disposición de la ventana secundaria

Una aplicación MDI controla el tamaño y la posición de sus ventanas secundarias enviando mensajes a la ventana del cliente MDI. Para maximizar la ventana secundaria activa, la aplicación envía el mensaje WM_MDIMAXIMIZE a la ventana del cliente. Cuando se maximiza una ventana secundaria, su área de cliente rellena completamente la ventana del cliente MDI. Además, el sistema oculta automáticamente la barra de título de la ventana secundaria y agrega el icono de menú de la ventana secundaria y el botón Restaurar a la barra de menús de la aplicación MDI. La aplicación puede restaurar la ventana del cliente a su tamaño y posición originales (premaximizados) enviando a la ventana de cliente un mensaje de WM_MDIRESTORE .

Una aplicación MDI puede organizar sus ventanas secundarias en un formato en cascada o en mosaico. Cuando las ventanas secundarias están en cascada, las ventanas aparecen en una pila. La ventana de la parte inferior de la pila ocupa la esquina superior izquierda de la pantalla y las ventanas restantes se desplazan vertical y horizontalmente para que el borde izquierdo y la barra de título de cada ventana secundaria estén visibles. Para organizar ventanas secundarias en formato en cascada, una aplicación MDI envía el mensaje WM_MDICASCADE . Normalmente, la aplicación envía este mensaje cuando el usuario hace clic en Cascade en el menú de la ventana.

Cuando las ventanas secundarias están en mosaico, el sistema muestra cada ventana secundaria en su totalidad, superponiendo ninguna de las ventanas. Todas las ventanas tienen el tamaño necesario para ajustarse a la ventana del cliente. Para organizar ventanas secundarias en el formato de icono, una aplicación MDI envía un mensaje WM_MDITILE a la ventana del cliente. Normalmente, la aplicación envía este mensaje cuando el usuario hace clic en Icono en el menú de la ventana.

Una aplicación MDI debe proporcionar un icono diferente para cada tipo de ventana secundaria que admita. La aplicación especifica un icono al registrar la clase de ventana secundaria. El sistema muestra automáticamente el icono de una ventana secundaria en la parte inferior de la ventana del cliente cuando se minimiza la ventana secundaria. Una aplicación MDI dirige el sistema para organizar iconos de ventana secundaria mediante el envío de un mensaje de WM_MDIICONARRANGE a la ventana del cliente. Normalmente, la aplicación envía este mensaje cuando el usuario hace clic en Organizar iconos en el menú de la ventana.

Icono Título de Windows

Dado que las ventanas secundarias MDI pueden minimizarse, una aplicación MDI debe evitar manipular ventanas de título de icono como si fueran ventanas secundarias MDI normales. Las ventanas de título del icono aparecen cuando la aplicación enumera las ventanas secundarias de la ventana del cliente MDI. Sin embargo, las ventanas de título del icono difieren de otras ventanas secundarias, ya que son propiedad de una ventana secundaria MDI.

Para determinar si una ventana secundaria es una ventana de título de icono, use la función GetWindow con el índice GW_OWNER. Las ventanas que no son de título devuelven NULL. Tenga en cuenta que esta prueba no es suficiente para las ventanas de nivel superior, ya que los menús y los cuadros de diálogo son ventanas de propiedad.

Datos de ventana secundaria

Dado que el número de ventanas secundarias varía en función del número de documentos que abra el usuario, una aplicación MDI debe poder asociar datos (por ejemplo, el nombre del archivo actual) con cada ventana secundaria. Existen dos modos para hacer esto:

  • Almacene los datos de la ventana secundaria en la estructura de la ventana.
  • Use las propiedades de la ventana.

Estructura de ventanas

Cuando una aplicación MDI registra una clase de ventana, puede reservar espacio adicional en la estructura de ventanas para los datos de aplicación específicos de esta clase determinada de ventanas. Para almacenar y recuperar datos en este espacio adicional, la aplicación usa las funciones GetWindowLong y SetWindowLong .

Para mantener una gran cantidad de datos para una ventana secundaria, una aplicación puede asignar memoria para una estructura de datos y, a continuación, almacenar el identificador en la memoria que contiene la estructura en el espacio adicional asociado a la ventana secundaria.

Propiedades de la ventana

Una aplicación MDI también puede almacenar datos por documento mediante propiedades de ventana. Los datos por documento son datos específicos del tipo de documento contenido en una ventana secundaria determinada. Las propiedades son diferentes del espacio adicional de la estructura de la ventana en que no es necesario asignar espacio adicional al registrar la clase de ventana. Una ventana puede tener cualquier número de propiedades. Además, cuando los desplazamientos se usan para acceder al espacio adicional en las estructuras de ventana, se hace referencia a las propiedades por nombres de cadena. Para obtener más información sobre las propiedades de la ventana, vea Propiedades de la ventana.