Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Elk document in een MDI-toepassing (Multiple Document Interface) wordt weergegeven in een afzonderlijk onderliggend venster in het clientgebied van het hoofdvenster van de toepassing. Typische MDI-toepassingen zijn tekstverwerkingstoepassingen waarmee de gebruiker kan werken met meerdere tekstdocumenten en spreadsheettoepassingen waarmee de gebruiker met meerdere grafieken en spreadsheets kan werken. Zie de volgende onderwerpen voor meer informatie.
- Frame, Client en Onderliggende Windows-
- Subvenster aanmaak
- activering van onderliggend venster
- menu's met meerdere documenten
- meerdere documentversnellers
- Subvenstergrootte en -rangschikking
- Titel van -pictogram in Windows
- onderliggende venstergegevens
Frame-, client- en kindvensters
Een MDI-toepassing heeft drie soorten vensters: een framevenster, een MDI-clientvenster en een aantal onderliggende vensters. Het framevenster is net als het hoofdvenster van de toepassing: het heeft een formaatrand, een titelbalk, een venstermenu, een knop minimaliseren en een knop maximaliseren. De toepassing moet een vensterklasse voor het framevenster registreren en een vensterprocedure opgeven om deze te ondersteunen.
Een MDI-toepassing geeft geen uitvoer weer in het clientgebied van het framevenster. In plaats daarvan wordt het MDI-clientvenster weergegeven. Een MDI-clientvenster is een speciaal type onderliggend venster dat hoort bij de vooraf geregistreerde vensterklasse MDICLIENT-. Het clientvenster is een kindvenster van het framevenster; het fungeert als de achtergrond voor kindvensters. Het biedt ook ondersteuning voor het maken en bewerken van onderliggende vensters. Een MDI-toepassing kan bijvoorbeeld onderliggende vensters maken, activeren of maximaliseren door berichten naar het MDI-clientvenster te verzenden.
Wanneer de gebruiker een document opent of maakt, maakt het clientvenster een onderliggend venster voor het document. Het clientvenster is het bovenliggende venster van alle MDI-onderliggende vensters in de toepassing. Elk subvenster heeft een formaatrand, een titelbalk, een venstermenu, een minimaliseerknop en een maximaliseerknop. Omdat een kindvenster wordt begrensd, is het beperkt tot het clientvenster en kan het niet daarbuiten verschijnen.
Een MDI-toepassing kan meer dan één soort document ondersteunen. Met een typische spreadsheettoepassing kan de gebruiker bijvoorbeeld werken met grafieken en spreadsheets. Voor elk type document dat het ondersteunt, moet een MDI-toepassing een onderliggende vensterklasse registreren en een vensterprocedure bieden ter ondersteuning van de vensters die tot die klasse behoren. Zie Vensterklassenvoor meer informatie over vensterklassen. Zie Vensterproceduresvoor meer informatie over vensterprocedures.
Hieronder volgt een typische MDI-toepassing. Het heet Multipad.
Kindvenster aanmaken
Als u een onderliggend venster wilt maken, roept een MDI-toepassing de functie CreateMDIWindow aan of verzendt het WM_MDICREATE bericht naar het MDI-clientvenster. Een efficiëntere manier om een onderliggend MDI-venster te maken, is door de functie CreateWindowEx aan te roepen, waarbij de WS_EX_MDICHILD uitgebreide stijl wordt opgegeven.
Als u een onderliggend venster wilt vernietigen, verzendt een MDI-toepassing een WM_MDIDESTROY bericht naar het MDI-clientvenster.
Activering van kindvenster
Een willekeurig aantal onderliggende vensters kan op elk gewenst moment in het clientvenster worden weergegeven, maar er kan slechts één actief zijn. Het actieve kindvenster wordt voor alle andere kindvensters geplaatst en de rand is gemarkeerd.
De gebruiker kan een inactief onderliggend venster activeren door erop te klikken. Een MDI-toepassing activeert een onderliggend venster door een WM_MDIACTIVATE bericht naar het MDI-clientvenster te verzenden. Wanneer het clientvenster dit bericht verwerkt, wordt er een WM_MDIACTIVATE bericht verzonden naar de vensterprocedure van het onderliggende venster dat moet worden geactiveerd en naar de vensterprocedure van het onderliggende venster dat wordt gedeactiveerd.
Als u wilt voorkomen dat een kinder-venster wordt geactiveerd, moet u het WM_NCACTIVATE bericht naar het kinder-venster afhandelen door FALSEte retourneren.
Het systeem houdt de positie van elk kindvenster bij in de volgorde van overlappende vensters. Deze stapeling wordt de Z-Ordergenoemd. De gebruiker kan het volgende onderliggende venster in de Z-volgorde activeren door te klikken op Volgende in het venstermenu in het actieve venster. Een toepassing activeert het volgende (of vorige) onderliggende venster in de Z-volgorde door een WM_MDINEXT bericht naar het clientvenster te verzenden.
Om het handvat van het actieve kindvenster op te halen, verzendt de MDI-toepassing een WM_MDIGETACTIVE boodschap naar het clientvenster.
Menu's met meerdere documenten
Het framevenster van een MDI-toepassing moet een menubalk met een venstermenu bevatten. Het venstermenu moet items bevatten die de kindvensters binnen het clientvenster rangschikken of alle kindvensters sluiten. Het venstermenu van een typische MDI-toepassing kan de items in de volgende tabel bevatten.
| Menu-item | Doel |
|---|---|
| tegel | Rangschikt kindervensters in een tegelindeling, zodat elk venster in zijn geheel wordt weergegeven in het clientvenster. |
| trapsgewijs | Rangschikt kindvensters in een trapsgewijze indeling. De kindvensters overlappen elkaar, maar de titelbalk van elk is zichtbaar. |
| Pictogrammen rangschikken | Rangschikt de pictogrammen van geminimaliseerde onderliggende vensters onderaan het clientvenster. |
| Alle sluiten | Sluit alle subvensters. |
Wanneer een onderliggend venster wordt gemaakt, voegt het systeem automatisch een nieuw menu-item toe aan het venstermenu. De tekst van het menu-item is hetzelfde als de tekst op de menubalk van het nieuwe onderliggende venster. Door op het menu-item te klikken, kan de gebruiker het bijbehorende onderliggende venster activeren. Wanneer een onderliggend venster wordt vernietigd, verwijdert het systeem automatisch het bijbehorende menu-item uit het venstermenu.
Het systeem kan maximaal tien menu-items toevoegen aan het venstermenu. Wanneer het tiende onderliggende venster wordt gemaakt, voegt het systeem het item Meer Windows toe aan het venstermenu. Als u op dit item klikt, wordt het dialoogvenster Venster selecteren weergegeven. Het dialoogvenster bevat een keuzelijst met de titels van alle MDI-onderliggende vensters die momenteel beschikbaar zijn. De gebruiker kan een onderliggend venster activeren door in de keuzelijst op de titel ervan te klikken.
Als uw MDI-toepassing ondersteuning biedt voor verschillende typen onderliggende vensters, past u de menubalk aan met de bewerkingen die zijn gekoppeld aan het actieve venster. Hiervoor geeft u afzonderlijke menubronnen op voor elk type onderliggend venster dat door de toepassing wordt ondersteund. Wanneer een nieuw type kindvenster wordt geactiveerd, moet de toepassing een WM_MDISETMENU bericht verzenden naar het clientvenster, waarbij het handvat wordt doorgegeven aan het overeenkomstige menu.
Als er geen onderliggend venster bestaat, mag de menubalk alleen items bevatten die worden gebruikt om een document te maken of te openen.
Wanneer de gebruiker door de menu's van een MDI-toepassing navigeert met behulp van cursortoetsen, gedragen de sleutels zich anders dan wanneer de gebruiker door de menu's van een typische toepassing navigeert. In een MDI-toepassing gaat de controle van het venstermenu van de toepassing naar het venstermenu van het actieve venster en vervolgens naar het eerste item op de menubalk.
Meerdere documentversnellers
Voor het ontvangen en verwerken van sneltoetsen voor de onderliggende vensters moet binnen een MDI-toepassing de functie TranslateMDISysAccel binnen de berichtlus worden opgenomen. De lus moet TranslateMDISysAccel aanroepen voordat de TranslateAccelerator of DispatchMessage functie wordt aangeroepen.
Sneltoetsen in het venstermenu van een MDI-onderliggend venster verschillen van die van een niet-MDI-onderliggend venster. In een onderliggend MDI-venster opent de toetsencombinatie Alt+ – (min) het venstermenu, de toetsencombinatie Ctrl+F4 sluit het actieve onderliggende venster en de toetsencombinatie Ctrl+F6 activeert het volgende onderliggende venster.
Grootte en rangschikking van onderliggend venster
Een MDI-toepassing bepaalt de grootte en positie van de onderliggende vensters door berichten te verzenden naar het MDI-clientvenster. Om het actieve kindvenster te maximaliseren, verzendt de toepassing het WM_MDIMAXIMIZE bericht naar het clientvenster. Wanneer een kindvenster wordt gemaximaliseerd, vult het clientgebied het MDI-clientvenster volledig. Bovendien verbergt het systeem automatisch de titelbalk van het kindvenster en voegt het het venstermenu-icoon van het kindvenster en de Herstelknop toe aan de menubalk van de MDI-toepassing. De toepassing kan het clientvenster herstellen naar de oorspronkelijke (vooraf gemaximiseerde) grootte en positie door het clientvenster een WM_MDIRESTORE bericht te verzenden.
Een MDI-toepassing kan de kindervensters in een cascadestijl of tegelstijl rangschikken. Wanneer de kindvensters trapsgewijs worden gerangschikt, verschijnen de vensters in een stapel. Het venster onderaan de stapel neemt de linkerbovenhoek van het scherm in beslag en de resterende vensters worden verticaal en horizontaal verschoven, zodat de linkerrand en titelbalk van elk onderliggend venster zichtbaar zijn. Als u kindvensters in cascade-indeling wilt rangschikken, verzendt een MDI-toepassing het WM_MDICASCADE bericht. Normaal gesproken verzendt de toepassing dit bericht wanneer de gebruiker klikt op Trapsgewijs in het venstermenu.
Wanneer de kindervensters worden betegeld, wordt elk kindervenster in zijn geheel weergegeven, waarbij geen van de vensters overlapt. Alle vensters hebben, indien nodig, het formaat om binnen het clientvenster te passen. Als u onderliggende vensters in de tegelindeling wilt rangschikken, verzendt een MDI-toepassing een WM_MDITILE bericht naar het clientvenster. Normaal gesproken verzendt de toepassing dit bericht wanneer de gebruiker op Tegel klikt in het venstermenu.
Een MDI-toepassing moet een ander pictogram weergeven voor elk type kindvenster dat het ondersteunt. De toepassing specificeert een pictogram bij het registreren van de kindervensterklasse. In het systeem wordt automatisch het pictogram van een onderliggend venster weergegeven in het onderste gedeelte van het clientvenster wanneer het onderliggende venster wordt geminimaliseerd. Een MDI-toepassing instrueert het systeem om pictogrammen van onderliggende vensters te rangschikken door een WM_MDIICONARRANGE bericht naar het clientvenster te verzenden. Normaal gesproken verzendt de toepassing dit bericht wanneer de gebruiker op Pictogrammen rangschikken in het venstermenu klikt.
Titel van pictogrammen in Windows
Omdat MDI-onderliggende vensters kunnen worden geminimaliseerd, moet een MDI-toepassing voorkomen dat vensters met geïconeerde titels worden gemanipuleerd alsof het normale MDI-onderliggende vensters zijn. Vensters met pictogramtitels worden weergegeven wanneer de toepassing de child vensters van de MDI-client opsomt. Pictogramvensters verschillen echter van andere kindvensters, omdat ze eigendom zijn van een MDI-kindvenster.
Als u wilt bepalen of een kindvenster een icoontitelvenster is, gebruikt u de functie GetWindow met de index GW_OWNER. Niet-titelvensters retourneren NULL-. Houd er rekening mee dat deze test onvoldoende is voor bovenliggende vensters, omdat menu's en dialoogvensters onderliggende vensters zijn.
Onderliggende venstergegevens
Omdat het aantal onderliggende vensters afhankelijk is van het aantal documenten dat de gebruiker opent, moet een MDI-toepassing gegevens (bijvoorbeeld de naam van het huidige bestand) kunnen koppelen aan elk onderliggend venster. U kunt dit op twee manieren doen:
- Sla subvenstergegevens op in de vensterstructuur.
- Venstereigenschappen gebruiken.
Vensterstructuur
Wanneer een MDI-toepassing een vensterklasse registreert, kan deze extra ruimte in de vensterstructuur reserveren voor toepassingsgegevens die specifiek zijn voor deze specifieke klasse van vensters. Voor het opslaan en ophalen van gegevens in deze extra ruimte gebruikt de toepassing de functies GetWindowLong en SetWindowLong.
Om een grote hoeveelheid gegevens voor een kindvenster te behouden, kan een toepassing geheugen toewijzen voor een gegevensstructuur en vervolgens de handle, die verwijst naar het geheugen met de structuur, opslaan in de extra ruimte die aan het kindvenster is gekoppeld.
Venstereigenschappen
Een MDI-toepassing kan ook gegevens per document opslaan met behulp van venstereigenschappen. gegevens per document zijn gegevens die specifiek zijn voor het type document in een bepaald onderliggend venster. Eigenschappen verschillen van extra ruimte in de vensterstructuur, omdat u geen extra ruimte hoeft toe te wijzen bij het registreren van de vensterklasse. Een venster kan een willekeurig aantal eigenschappen hebben. Waar offsets worden gebruikt om toegang te krijgen tot de extra ruimte in vensterstructuren, worden eigenschappen ook aangeduid door tekenreeksnamen. Zie Venstereigenschappenvoor meer informatie over venstereigenschappen.