Dela via


Om gränssnittet för flera dokument

Varje dokument i ett MDI-program (multiple-document interface) visas i ett separat underordnat fönster i klientområdet i programmets huvudfönster. Vanliga MDI-program omfattar ordbearbetningsprogram som gör att användaren kan arbeta med flera textdokument och kalkylbladsprogram som gör att användaren kan arbeta med flera diagram och kalkylblad. Mer information finns i följande avsnitt.

Ramfönster, klient och underordnade Windows

Ett MDI-program har tre typer av fönster: ett ramfönster, ett MDI-klientfönster samt ett antal underordnade fönster. Det ramfönstret är som programmets huvudfönster: det har en justeringskant, en titelrad, en fönstermeny, en minimera-knapp och en maximeringsknapp. Programmet måste registrera en fönsterklass för ramfönstret och ange en fönsterprocedur som stöder det.

Ett MDI-program visar inte utdata i klientområdet i ramfönstret. I stället visas MDI-klientfönstret. Ett MDI-klientfönster är en särskild typ av underordnat fönster som tillhör den förregistrerade fönsterklassen MDICLIENT. Klientfönstret är ett barn till ramfönstret; det fungerar som bakgrund för barnafönster. Det ger också stöd för att skapa och hantera fönsterbarn. Ett MDI-program kan till exempel skapa, aktivera eller maximera underordnade fönster genom att skicka meddelanden till MDI-klientfönstret.

När användaren öppnar eller skapar ett dokument skapar klientfönstret ett underordnat fönster för dokumentet. Klientfönstret är det överordnade fönstret för alla MDI-underordnade fönster i programmet. Varje underordnat fönster har en justerbar kant, en titelrad, en fönstermeny, en minimeringsknapp och en maximeringsknapp. Eftersom ett underordnat fönster är klippt är det begränsat till klientfönstret och kan inte visas utanför det.

Ett MDI-program kan ha stöd för mer än en typ av dokument. Ett typiskt kalkylbladsprogram gör det till exempel möjligt för användaren att arbeta med både diagram och kalkylblad. För varje typ av dokument som stöds måste ett MDI-program registrera en underordnad fönsterklass och tillhandahålla en fönsterprocedur för att stödja de fönster som tillhör den klassen. Mer information om fönsterklasser finns i Fönsterklasser. Mer information om fönsterprocedurer finns i Fönsterprocedurer.

Följande är ett typiskt MDI-program. Den heter Multipad.

Skärmbild av ett multipad mdi-programramfönster och klientfönster.

Skapandet av underfönster

För att skapa ett underordnat fönster anropar ett MDI-program antingen funktionen CreateMDIWindow eller skickar WM_MDICREATE-meddelandet till MDI-klientfönstret. Ett mer effektivt sätt att skapa ett underordnat MDI-fönster är att anropa funktionen CreateWindowEx och ange WS_EX_MDICHILD utökad formatmall.

För att förstöra ett underordnat fönster skickar ett MDI-program ett WM_MDIDESTROY meddelande till MDI-klientfönstret.

Aktivering av underordnat fönster

Valfritt antal underordnade fönster kan visas i klientfönstret samtidigt, men bara ett fönster kan vara aktivt. Det aktiva barnfönstret är placerat framför alla andra barnfönster, och dess kantlinje är markerad.

Användaren kan aktivera en inaktiv underruta genom att klicka på den. Ett MDI-program aktiverar ett underordnat fönster genom att skicka ett WM_MDIACTIVATE meddelande till MDI-klientfönstret. När klientfönstret bearbetar det här meddelandet skickar det ett WM_MDIACTIVATE meddelande till fönsterproceduren i det underordnade fönstret som ska aktiveras och till fönsterproceduren för det underordnade fönstret som inaktiveras.

Om du vill förhindra att ett underordnat fönster aktiveras hanterar du meddelandet WM_NCACTIVATE till det underordnade fönstret genom att returnera FALSE.

Systemet spårar varje barnfönsters position i stacken med överlappande fönster. Den här staplingen kallas Z-Order. Användaren kan aktivera nästa underordnade fönster i Z-ordningen genom att klicka på Nästa från fönstermenyn i det aktiva fönstret. Ett program aktiverar nästa (eller tidigare) underordnade fönster i Z-ordningen genom att skicka ett WM_MDINEXT meddelande till klientfönstret.

För att hämta handtaget till det aktiva underordnade fönstret skickar MDI-programmet ett WM_MDIGETACTIVE meddelande till klientfönstret.

Flera dokumentmenyer

Ramfönstret för ett MDI-program ska innehålla en menyrad med en fönstermeny. Fönstermenyn ska innehålla objekt som ordnar underordnade fönster i klientfönstret eller som stänger alla underordnade fönster. Fönstermenyn för ett typiskt MDI-program kan innehålla objekten i följande tabell.

Menyalternativ Avsikt
platta Ordnar underordnade fönster i ett panelformat så att var och en visas i sin helhet i klientfönstret.
Cascade Ordnar underordnade fönster i ett kaskadformat. De barnafönster överlappar varandra, men titelraden för varje är synlig.
Ordna ikoner Ordnar ikonerna för minimerade barnfönster längst ned i klientfönstret.
Stäng alla Stänger alla underordnade fönster.

När ett underordnat fönster skapas lägger systemet automatiskt till ett nytt menyalternativ i fönstermenyn. Texten i menyalternativet är samma som texten i menyraden i det nya underordnade fönstret. Genom att klicka på menyalternativet kan användaren aktivera motsvarande underordnade fönster. När ett underordnat fönster förstörs tar systemet automatiskt bort motsvarande menyalternativ från fönstermenyn.

Systemet kan lägga till upp till tio menyalternativ i fönstermenyn. När det tionde barnfönstret skapas lägger systemet till objektet Fler fönster i fönstermenyn. Om du klickar på det här objektet visas dialogrutan Välj fönster. Dialogrutan innehåller en listbox med rubrikerna för alla underordnade MDI-fönster som för närvarande är tillgängliga. Användaren kan aktivera ett underordnat fönster genom att klicka på dess rubrik i listrutan.

Om ditt MDI-program stöder flera typer av underordnade fönster skräddarsyr du menyraden så att den återspeglar de åtgärder som är associerade med det aktiva fönstret. Det gör du genom att ange separata menyresurser för varje typ av underordnat fönster som programmet stöder. När en ny typ av underordnat fönster aktiveras ska programmet skicka ett WM_MDISETMENU-meddelande till klientfönstret och överföra referensen till motsvarande meny.

När det inte finns något underordnat fönster ska menyraden endast innehålla objekt som används för att skapa eller öppna ett dokument.

När användaren navigerar genom ett MDI-programs menyer med hjälp av markörnycklar fungerar nycklarna annorlunda än när användaren navigerar genom ett typiskt programs menyer. I ett MDI-program skickas kontrollen från programmets fönstermeny till fönstermenyn i det aktiva underordnade fönstret och sedan till det första objektet på menyraden.

Flera dokumentacceleratorer

För att ta emot och bearbeta acceleratornycklar för sina underordnade fönster måste ett MDI-program inkludera funktionen TranslateMDISysAccel i meddelandeloopen. Loopen måste anropa TranslateMDISysAccel innan den anropar funktionen TranslateAccelerator eller DispatchMessage.

Acceleratornycklarna på fönstermenyn för ett MDI-underfönster skiljer sig från dem för ett underfönster utan MDI. I ett underordnat MDI-fönster öppnar tangentkombinationen ALT+ – (minus) fönstermenyn, tangentkombinationen CTRL+F4 stänger det aktiva underordnade fönstret och tangentkombinationen CTRL+F6 aktiverar nästa underordnade fönster.

Underfönstrets storlek och arrangemang

Ett MDI-program styr storleken och positionen för dess underordnade fönster genom att skicka meddelanden till MDI-klientfönstret. För att maximera det aktiva barnfönstret skickar programmet meddelandet WM_MDIMAXIMIZE till klientfönstret. När ett underordnat fönster maximeras fyller dess klientområde hela MDI-klientfönstret. Dessutom döljer systemet automatiskt det underordnade fönstrets namnlist och lägger till det underordnade fönstrets fönstermenyikon och knappen Återställ i MDI-programmets menyrad. Programmet kan återställa klientfönstret till sin ursprungliga (förmaximerade) storlek och position genom att skicka klientfönstret ett WM_MDIRESTORE meddelande.

Ett MDI-program kan ordna sina underordnade fönster i antingen ett kaskad- eller panelformat. När underfönstren är kaskaderade visas fönstren i en stack. Fönstret längst ned i stacken upptar det övre vänstra hörnet på skärmen och de återstående fönstren förskjuts lodrätt och vågrätt så att den vänstra kantlinjen och namnlisten för varje underordnat fönster visas. För att ordna underordnade fönster i kaskadformat skickar ett MDI-program meddelandet WM_MDICASCADE. Vanligtvis skickar programmet det här meddelandet när användaren klickar på Cascade på fönstermenyn.

När barnfönstren är kaklade visar systemet varje barnfönster i sin helhet — utan överlappning. Alla fönster är vid behov storleksanpassade för att passa in i klientfönstret. För att ordna underordnade fönster i panelformat skickar ett MDI-program ett WM_MDITILE meddelande till klientfönstret. Normalt skickar programmet det här meddelandet när användaren klickar på Kakel på fönstermenyn.

Ett MDI-program bör ange en annan ikon för varje typ av underordnat fönster som det stöder. Programmet anger en ikon när barnfönsterklassen registreras. Systemet visar automatiskt ikonen för ett underordnat fönster i den nedre delen av klientfönstret när det underordnade fönstret minimeras. Ett MDI-program instruerar systemet att ordna barnfönsterikoner genom att skicka ett meddelande av typen WM_MDIICONARRANGE till klientfönstret. Vanligtvis skickar programmet det här meddelandet när användaren klickar på Ordna ikoner på fönstermenyn.

Ikontitel Windows

Eftersom MDI-underordnade fönster kan minimeras måste ett MDI-program undvika att ändra ikonrubrikfönster som om de vore normala MDI-underordnade fönster. Ikonrubrikfönster visas när programmet räknar upp underordnade fönster i MDI-klientfönstret. Fönster med ikonrubrik skiljer sig dock från andra underordnade fönster eftersom de ägs av ett child-fönster inom MDI.

Om du vill ta reda på om ett underordnat fönster är ett ikonrubrikfönster använder du funktionen GetWindow med GW_OWNER index. Icke-rubrikfönster returnerar NULL. Observera att det här testet inte är tillräckligt för toppnivåfönster, eftersom menyer och dialogrutor är ägda fönster.

Barnfönsterdata

Eftersom antalet underordnade fönster varierar beroende på hur många dokument användaren öppnar, måste ett MDI-program kunna associera data (till exempel namnet på den aktuella filen) med varje underordnat fönster. Det finns två sätt att göra detta:

  • Lagra underordnade fönsterdata i fönsterstrukturen.
  • Använd fönsteregenskaper.

Fönsterstruktur

När ett MDI-program registrerar en fönsterklass kan det reservera extra utrymme i fönsterstrukturen för programdata som är specifika för just den här klassen av fönster. För att lagra och hämta data i det här extra utrymmet använder programmet funktionerna GetWindowLong och SetWindowLong.

För att underhålla en stor mängd data för ett underordnat fönster kan ett program allokera minne för en datastruktur och sedan lagra handtaget till minnet som innehåller strukturen i det extra utrymme som är associerat med det underordnade fönstret.

Fönsteregenskaper

Ett MDI-program kan också lagra data per dokument med hjälp av fönsteregenskaper. Dokumentspecifik data är data som är specifik för den typ av dokument som är innesluten i ett specifikt underordnat fönster. Egenskaperna skiljer sig från extra utrymme i fönsterstrukturen eftersom du inte behöver allokera extra utrymme när du registrerar fönsterklassen. Ett fönster kan ha valfritt antal egenskaper. Dessutom, där förskjutningar används för att komma åt det extra utrymmet i fönsterstrukturer, refereras egenskaper till med strängnamn. Mer information om fönsteregenskaper finns i Fönsteregenskaper.