À propos de l’interface de plusieurs documents

Chaque document d’une application MDI (Multi-Document Interface) s’affiche dans une fenêtre enfant distincte dans la zone cliente de la fenêtre main de l’application. Les applications MDI classiques incluent des applications de traitement de texte qui permettent à l’utilisateur d’utiliser plusieurs documents texte, et des applications de feuilles de calcul qui permettent à l’utilisateur d’utiliser plusieurs graphiques et feuilles de calcul. Pour plus d'informations, consultez les rubriques ci-dessous.

Fenêtres Frame, Client et Enfants

Une application MDI a trois types de fenêtres : une fenêtre frame, une fenêtre cliente MDI, ainsi qu’un certain nombre de fenêtres enfants. La fenêtre frame est semblable à la fenêtre main de l’application : elle a une bordure de dimensionnement, une barre de titre, un menu de fenêtre, un bouton réduire et un bouton agrandir. L’application doit inscrire une classe de fenêtre pour la fenêtre frame et fournir une procédure de fenêtre pour la prendre en charge.

Une application MDI n’affiche pas de sortie dans la zone cliente de la fenêtre frame. Au lieu de cela, il affiche la fenêtre du client MDI. Une fenêtre cliente MDI est un type spécial de fenêtre enfant appartenant à la classe de fenêtre préinscriée MDICLIENT. La fenêtre cliente est un enfant de la fenêtre frame ; il sert d’arrière-plan pour les fenêtres enfants. Il prend également en charge la création et la manipulation de fenêtres enfants. Par exemple, une application MDI peut créer, activer ou agrandir des fenêtres enfants en envoyant des messages à la fenêtre cliente MDI.

Lorsque l’utilisateur ouvre ou crée un document, la fenêtre cliente crée une fenêtre enfant pour le document. La fenêtre cliente est la fenêtre parente de toutes les fenêtres enfants MDI dans l’application. Chaque fenêtre enfant a une bordure de dimensionnement, une barre de titre, un menu de fenêtre, un bouton réduire et un bouton agrandir. Étant donné qu’une fenêtre enfant est clippée, elle est limitée à la fenêtre cliente et ne peut pas apparaître en dehors de celle-ci.

Une application MDI peut prendre en charge plusieurs types de documents. Par exemple, une application de feuille de calcul classique permet à l’utilisateur d’utiliser des graphiques et des feuilles de calcul. Pour chaque type de document qu’elle prend en charge, une application MDI doit inscrire une classe de fenêtre enfant et fournir une procédure de fenêtre pour prendre en charge les fenêtres appartenant à cette classe. Pour plus d’informations sur les classes de fenêtre, consultez Classes de fenêtre. Pour plus d’informations sur les procédures de fenêtre, consultez Procédures de fenêtre.

Voici une application MDI classique. Il s’appelle Multipad.

Fenêtre de cadre d’application multipad mdi et fenêtre cliente

Création d’une fenêtre enfant

Pour créer une fenêtre enfant, une application MDI appelle la fonction CreateMDIWindow ou envoie le message WM_MDICREATE à la fenêtre cliente MDI. Un moyen plus efficace de créer une fenêtre enfant MDI consiste à appeler la fonction CreateWindowEx , en spécifiant le style étendu WS_EX_MDICHILD .

Pour détruire une fenêtre enfant, une application MDI envoie un message WM_MDIDESTROY à la fenêtre cliente MDI.

Activation de la fenêtre enfant

Un nombre quelconque de fenêtres enfants peut apparaître dans la fenêtre cliente à tout moment, mais une seule peut être active. La fenêtre enfant active est positionnée devant toutes les autres fenêtres enfants et sa bordure est mise en surbrillance.

L’utilisateur peut activer une fenêtre enfant inactive en cliquant dessus. Une application MDI active une fenêtre enfant en envoyant un message WM_MDIACTIVATE à la fenêtre cliente MDI. Lorsque la fenêtre cliente traite ce message, elle envoie un message WM_MDIACTIVATE à la procédure de fenêtre de la fenêtre enfant à activer et à la procédure de fenêtre de la fenêtre enfant en cours de désactivation.

Pour empêcher l’activation d’une fenêtre enfant, gérez le message WM_NCACTIVATE à la fenêtre enfant en retournant FALSE.

Le système effectue le suivi de la position de chaque fenêtre enfant dans la pile des fenêtres qui se chevauchent. Cet empilement est appelé ordre Z. L’utilisateur peut activer la fenêtre enfant suivante dans l’ordre Z en cliquant sur Suivant dans le menu de la fenêtre active. Une application active la fenêtre enfant suivante (ou précédente) dans l’ordre Z en envoyant un message WM_MDINEXT à la fenêtre cliente.

Pour récupérer le handle dans la fenêtre enfant active, l’application MDI envoie un message WM_MDIGETACTIVE à la fenêtre cliente.

Menus de documents multiples

La fenêtre frame d’une application MDI doit inclure une barre de menus avec un menu fenêtre. Le menu de la fenêtre doit inclure des éléments qui organisent les fenêtres enfants dans la fenêtre cliente ou qui ferment toutes les fenêtres enfants. Le menu fenêtre d’une application MDI classique peut inclure les éléments du tableau suivant.

Élément de menu Objectif
Vignette Organise les fenêtres enfants dans un format de vignette afin que chacune d’elles apparaisse dans son intégralité dans la fenêtre cliente.
Cascade Organise les fenêtres enfants dans un format en cascade. Les fenêtres enfants se chevauchent, mais la barre de titre de chacune d’elles est visible.
Réorganiser les icônes Organise les icônes des fenêtres enfants réduites en bas de la fenêtre cliente.
Fermer tout Ferme toutes les fenêtres enfants.

 

Chaque fois qu’une fenêtre enfant est créée, le système ajoute automatiquement un nouvel élément de menu au menu de la fenêtre. Le texte de l’élément de menu est identique à celui de la barre de menus de la nouvelle fenêtre enfant. En cliquant sur l’élément de menu, l’utilisateur peut activer la fenêtre enfant correspondante. Lorsqu’une fenêtre enfant est détruite, le système supprime automatiquement l’élément de menu correspondant du menu de la fenêtre.

Le système peut ajouter jusqu’à dix éléments de menu au menu de la fenêtre. Lorsque la dixième fenêtre enfant est créée, le système ajoute l’élément Autres fenêtres au menu de la fenêtre. Cliquez sur cet élément pour afficher la boîte de dialogue Sélectionner une fenêtre . La boîte de dialogue contient une zone de liste avec les titres de toutes les fenêtres enfants MDI actuellement disponibles. L’utilisateur peut activer une fenêtre enfant en cliquant sur son titre dans la zone de liste.

Si votre application MDI prend en charge plusieurs types de fenêtres enfants, personnalisez la barre de menus pour refléter les opérations associées à la fenêtre active. Pour ce faire, fournissez des ressources de menu distinctes pour chaque type de fenêtre enfant prise en charge par l’application. Lorsqu’un nouveau type de fenêtre enfant est activé, l’application doit envoyer un message WM_MDISETMENU à la fenêtre cliente, en lui passant le handle au menu correspondant.

Quand aucune fenêtre enfant n’existe, la barre de menus doit contenir uniquement les éléments utilisés pour créer ou ouvrir un document.

Lorsque l’utilisateur navigue dans les menus d’une application MDI à l’aide de touches de curseur, les touches se comportent différemment des menus d’une application classique. Dans une application MDI, le contrôle passe du menu de la fenêtre de l’application au menu fenêtre de la fenêtre enfant active, puis au premier élément de la barre de menus.

Accélérateurs de documents multiples

Pour recevoir et traiter des touches d’accélérateur pour ses fenêtres enfants, une application MDI doit inclure la fonction TranslateMDISysAccel dans sa boucle de message. La boucle doit appeler TranslateMDISysAccel avant d’appeler la fonction TranslateAccelerator ou DispatchMessage .

Les touches d’accélérateur dans le menu de la fenêtre pour une fenêtre enfant MDI sont différentes de celles d’une fenêtre enfant non MDI. Dans une fenêtre enfant MDI, la combinaison de touches ALT+ – (moins) ouvre le menu de la fenêtre, la combinaison de touches CTRL+F4 ferme la fenêtre enfant active et la combinaison de touches CTRL+F6 active la fenêtre enfant suivante.

Taille et disposition de la fenêtre enfant

Une application MDI contrôle la taille et la position de ses fenêtres enfants en envoyant des messages à la fenêtre cliente MDI. Pour optimiser la fenêtre enfant active, l’application envoie le message WM_MDIMAXIMIZE à la fenêtre cliente. Lorsqu’une fenêtre enfant est agrandie, sa zone cliente remplit complètement la fenêtre cliente MDI. En outre, le système masque automatiquement la barre de titre de la fenêtre enfant et ajoute l’icône de menu de la fenêtre enfant et le bouton Restaurer à la barre de menus de l’application MDI. L’application peut restaurer la fenêtre cliente à sa taille et à sa position d’origine (prémaximisée) en envoyant à la fenêtre cliente un message WM_MDIRESTORE .

Une application MDI peut organiser ses fenêtres enfants au format cascade ou vignette. Lorsque les fenêtres enfants sont mises en cascade, les fenêtres apparaissent dans une pile. La fenêtre située en bas de la pile occupe le coin supérieur gauche de l’écran, et les fenêtres restantes sont décalées verticalement et horizontalement afin que la bordure gauche et la barre de titre de chaque fenêtre enfant soient visibles. Pour organiser les fenêtres enfants au format en cascade, une application MDI envoie le message WM_MDICASCADE . En règle générale, l’application envoie ce message lorsque l’utilisateur clique sur Cascade dans le menu de la fenêtre.

Lorsque les fenêtres enfants sont en mosaïque, le système affiche chaque fenêtre enfant dans son intégralité, sans qu’aucune fenêtre ne se chevauche. Toutes les fenêtres sont dimensionnées, si nécessaire, pour tenir dans la fenêtre cliente. Pour organiser les fenêtres enfants au format de vignette, une application MDI envoie un message WM_MDITILE à la fenêtre cliente. En règle générale, l’application envoie ce message lorsque l’utilisateur clique sur Vignette dans le menu de la fenêtre.

Une application MDI doit fournir une icône différente pour chaque type de fenêtre enfant qu’elle prend en charge. L’application spécifie une icône lors de l’inscription de la classe de fenêtre enfant. Le système affiche automatiquement l’icône d’une fenêtre enfant dans la partie inférieure de la fenêtre cliente lorsque la fenêtre enfant est réduite. Une application MDI indique au système d’organiser les icônes de fenêtre enfant en envoyant un message WM_MDIICONARRANGE à la fenêtre cliente. En règle générale, l’application envoie ce message lorsque l’utilisateur clique sur Organiser les icônes dans le menu de la fenêtre.

Fenêtres de titre de l’icône

Étant donné que les fenêtres enfants MDI peuvent être réduites, une application MDI doit éviter de manipuler les fenêtres de titre d’icône comme s’il s’agissait de fenêtres enfants MDI normales. Les fenêtres de titre d’icône s’affichent lorsque l’application énumère les fenêtres enfants de la fenêtre cliente MDI. Toutefois, les fenêtres de titre d’icône diffèrent des autres fenêtres enfants en ce qu’elles appartiennent à une fenêtre enfant MDI.

Pour déterminer si une fenêtre enfant est une fenêtre de titre d’icône, utilisez la fonction GetWindow avec l’index GW_OWNER. Les fenêtres sans titre retournent la valeur NULL. Notez que ce test est insuffisant pour les fenêtres de niveau supérieur, car les menus et les boîtes de dialogue appartiennent à des fenêtres.

Données de fenêtre enfant

Étant donné que le nombre de fenêtres enfants varie en fonction du nombre de documents ouverts par l’utilisateur, une application MDI doit être en mesure d’associer des données (par exemple, le nom du fichier actuel) à chaque fenêtre enfant. Il existe deux façons d'effectuer cette opération :

  • Stockez les données de fenêtre enfant dans la structure de la fenêtre.
  • Utilisez les propriétés de fenêtre.

Structure de la fenêtre

Lorsqu’une application MDI inscrit une classe de fenêtre, elle peut réserver de l’espace supplémentaire dans la structure de la fenêtre pour les données d’application spécifiques à cette classe de fenêtres particulière. Pour stocker et récupérer des données dans cet espace supplémentaire, l’application utilise les fonctions GetWindowLong et SetWindowLong .

Pour conserver une grande quantité de données pour une fenêtre enfant, une application peut allouer de la mémoire à une structure de données, puis stocker le handle dans la mémoire contenant la structure dans l’espace supplémentaire associé à la fenêtre enfant.

Propriétés de la fenêtre

Une application MDI peut également stocker des données par document à l’aide de propriétés de fenêtre. Les données par document sont des données spécifiques au type de document contenu dans une fenêtre enfant particulière. Les propriétés sont différentes de l’espace supplémentaire dans la structure de la fenêtre, car vous n’avez pas besoin d’allouer d’espace supplémentaire lors de l’inscription de la classe de fenêtre. Une fenêtre peut avoir n’importe quel nombre de propriétés. En outre, lorsque les décalages sont utilisés pour accéder à l’espace supplémentaire dans les structures de fenêtre, les propriétés sont référencées par des noms de chaîne. Pour plus d’informations sur les propriétés de la fenêtre, consultez Propriétés de la fenêtre.