Informationen zur Schnittstelle mit mehreren Dokumenten

Jedes Dokument in einer MDI-Anwendung (Multiple Document Interface) wird in einem separaten untergeordneten Fenster im Clientbereich des Standard Fensters der Anwendung angezeigt. Typische MDI-Anwendungen umfassen Textverarbeitungsanwendungen, die es dem Benutzer ermöglichen, mit mehreren Textdokumenten zu arbeiten, und Tabellenkalkulationsanwendungen, die es dem Benutzer ermöglichen, mit mehreren Diagrammen und Tabellenkalkulationen zu arbeiten. Weitere Informationen finden Sie in den folgenden Themen.

Frame-, Client- und untergeordnete Fenster

Eine MDI-Anwendung verfügt über drei Arten von Fenstern: ein Rahmenfenster, ein MDI-Clientfenster sowie eine Reihe von untergeordneten Fenstern. Das Rahmenfenster ähnelt dem Standard Fenster der Anwendung: Es verfügt über einen Größenrahmen, eine Titelleiste, ein Fenstermenü, eine Schaltfläche "Minimieren" und eine Schaltfläche "Maximieren". Die Anwendung muss eine Fensterklasse für das Framefenster registrieren und eine Fensterprozedur zur Unterstützung bereitstellen.

Eine MDI-Anwendung zeigt keine Ausgabe im Clientbereich des Framefensters an. Stattdessen wird das MDI-Clientfenster angezeigt. Ein MDI-Clientfenster ist ein spezieller Typ von untergeordneten Fenstern, die zur vorregistrierten Fensterklasse MDICLIENT gehören. Das Clientfenster ist ein untergeordnetes Element des Rahmenfensters. sie dient als Hintergrund für untergeordnete Fenster. Es bietet auch Unterstützung für das Erstellen und Bearbeiten untergeordneter Fenster. Beispielsweise kann eine MDI-Anwendung untergeordnete Fenster erstellen, aktivieren oder maximieren, indem sie Nachrichten an das MDI-Clientfenster sendet.

Wenn der Benutzer ein Dokument öffnet oder erstellt, erstellt das Clientfenster ein untergeordnetes Fenster für das Dokument. Das Clientfenster ist das übergeordnete Fenster aller untergeordneten MDI-Fenster in der Anwendung. Jedes untergeordnete Fenster verfügt über einen Größenrahmen, eine Titelleiste, ein Fenstermenü, eine Schaltfläche "Minimieren" und eine Schaltfläche "Maximieren". Da ein untergeordnetes Fenster abgeschnitten ist, ist es auf das Clientfenster beschränkt und kann nicht außerhalb des Fensters angezeigt werden.

Eine MDI-Anwendung kann mehrere Dokumentarten unterstützen. Mit einer typischen Tabellenkalkulationsanwendung kann der Benutzer beispielsweise sowohl mit Diagrammen als auch mit Tabellenkalkulationen arbeiten. Für jeden Dokumenttyp, den sie unterstützt, muss eine MDI-Anwendung eine untergeordnete Fensterklasse registrieren und eine Fensterprozedur bereitstellen, um die Fenster zu unterstützen, die zu dieser Klasse gehören. Weitere Informationen zu Fensterklassen finden Sie unter Fensterklassen. Weitere Informationen zu Fensterprozeduren finden Sie unter Fensterprozeduren.

Es folgt eine typische MDI-Anwendung. Es heißt Multipad.

Multipad-mdi-Anwendungsrahmenfenster und Clientfenster

Erstellung untergeordneter Fenster

Um ein untergeordnetes Fenster zu erstellen, ruft eine MDI-Anwendung entweder die CreateMDIWindow-Funktion auf oder sendet die WM_MDICREATE Nachricht an das MDI-Clientfenster. Eine effizientere Möglichkeit zum Erstellen eines untergeordneten MDI-Fensters besteht darin, die CreateWindowEx-Funktion aufzurufen und die WS_EX_MDICHILD erweiterten Stil anzugeben.

Um ein untergeordnetes Fenster zu zerstören, sendet eine MDI-Anwendung eine WM_MDIDESTROY Nachricht an das MDI-Clientfenster.

Aktivierung des untergeordneten Fensters

Im Clientfenster kann eine beliebige Anzahl untergeordneter Fenster gleichzeitig angezeigt werden, aber nur eines kann aktiv sein. Das aktive untergeordnete Fenster befindet sich vor allen anderen untergeordneten Fenstern, und sein Rahmen ist hervorgehoben.

Der Benutzer kann ein inaktives untergeordnetes Fenster aktivieren, indem er darauf klickt. Eine MDI-Anwendung aktiviert ein untergeordnetes Fenster, indem eine WM_MDIACTIVATE Nachricht an das MDI-Clientfenster gesendet wird. Während das Clientfenster diese Nachricht verarbeitet, sendet es eine WM_MDIACTIVATE Nachricht an die Fensterprozedur des untergeordneten Fensters, das aktiviert werden soll, und an die Fensterprozedur des untergeordneten Fensters, das deaktiviert wird.

Um die Aktivierung eines untergeordneten Fensters zu verhindern, behandeln Sie die WM_NCACTIVATE Nachricht an das untergeordnete Fenster, indem Sie FALSE zurückgeben.

Das System verfolgt die Position jedes untergeordneten Fensters im Stapel überlappender Fenster nach. Dieses Stapeln wird als Z-Order bezeichnet. Der Benutzer kann das nächste untergeordnete Fenster in der Z-Reihenfolge aktivieren, indem er im aktiven Fenstermenü auf Weiter klickt. Eine Anwendung aktiviert das nächste (oder vorherige) untergeordnete Fenster in der Z-Reihenfolge, indem eine WM_MDINEXT Nachricht an das Clientfenster gesendet wird.

Um das Handle im aktiven untergeordneten Fenster abzurufen, sendet die MDI-Anwendung eine WM_MDIGETACTIVE Nachricht an das Clientfenster.

Mehrere Dokumentmenüs

Das Rahmenfenster einer MDI-Anwendung sollte eine Menüleiste mit einem Fenstermenü enthalten. Das Fenstermenü sollte Elemente enthalten, die die untergeordneten Fenster im Clientfenster anordnen oder alle untergeordneten Fenster schließen. Das Fenstermenü einer typischen MDI-Anwendung kann die Elemente in der folgenden Tabelle enthalten.

Menüelement Zweck
Kachel Ordnet untergeordnete Fenster in einem Kachelformat an, sodass jedes im Clientfenster vollständig angezeigt wird.
Cascade Ordnet untergeordnete Fenster in einem Kaskadenformat an. Die untergeordneten Fenster überlappen sich, aber die Titelleiste der einzelnen Fenster ist sichtbar.
Symbole anordnen Ordnet die Symbole minimierter untergeordneter Fenster am unteren Rand des Clientfensters an.
Alle schließen Schließt alle untergeordneten Fenster.

 

Wenn ein untergeordnetes Fenster erstellt wird, fügt das System automatisch ein neues Menüelement an das Fenstermenü an. Der Text des Menüelements ist mit dem Text auf der Menüleiste des neuen untergeordneten Fensters identisch. Durch Klicken auf das Menüelement kann der Benutzer das entsprechende untergeordnete Fenster aktivieren. Wenn ein untergeordnetes Fenster zerstört wird, entfernt das System automatisch das entsprechende Menüelement aus dem Fenstermenü.

Das System kann dem Fenstermenü bis zu zehn Menüelemente hinzufügen. Wenn das zehnte untergeordnete Fenster erstellt wird, fügt das System dem Fenstermenü das Element Weitere Windows hinzu. Wenn Sie auf dieses Element klicken, wird das Dialogfeld Fenster auswählen angezeigt. Das Dialogfeld enthält ein Listenfeld mit den Titeln aller derzeit verfügbaren untergeordneten MDI-Fenster. Der Benutzer kann ein untergeordnetes Fenster aktivieren, indem er im Listenfeld auf den Titel klickt.

Wenn Ihre MDI-Anwendung mehrere Arten von untergeordneten Fenstern unterstützt, passen Sie die Menüleiste an die Vorgänge an, die dem aktiven Fenster zugeordnet sind. Stellen Sie hierzu separate Menüressourcen für jeden Typ von untergeordneten Fenstern bereit, die die Anwendung unterstützt. Wenn ein neuer Typ von untergeordnetem Fenster aktiviert wird, sollte die Anwendung eine WM_MDISETMENU Nachricht an das Clientfenster senden und das Handle an das entsprechende Menü übergeben.

Wenn kein untergeordnetes Fenster vorhanden ist, sollte die Menüleiste nur Elemente enthalten, die zum Erstellen oder Öffnen eines Dokuments verwendet werden.

Wenn der Benutzer mithilfe von Cursortasten durch die Menüs einer MDI-Anwendung navigiert, verhalten sich die Tasten anders als beim Navigieren durch die Menüs einer typischen Anwendung. In einer MDI-Anwendung wird das Steuerelement vom Fenstermenü der Anwendung an das Fenstermenü des aktiven untergeordneten Fensters und dann an das erste Element auf der Menüleiste übergeben.

Mehrere Dokumentbeschleunigungen

Zum Empfangen und Verarbeiten von Beschleunigungsschlüsseln für die untergeordneten Fenster muss eine MDI-Anwendung die TranslateMDISysAccel-Funktion in ihrer Nachrichtenschleife enthalten. Die Schleife muss TranslateMDISysAccel aufrufen, bevor die Funktion TranslateAccelerator oder DispatchMessage aufgerufen wird.

Die Tastenkombinationen im Fenstermenü für ein untergeordnetes MDI-Fenster unterscheiden sich von denen für ein untergeordnetes Nicht-MDI-Fenster. In einem untergeordneten MDI-Fenster öffnet die Tastenkombination ALT+ – (Minus) das Fenstermenü, die Tastenkombination STRG+F4 schließt das aktive untergeordnete Fenster, und die Tastenkombination STRG+F6 aktiviert das nächste untergeordnete Fenster.

Größe und Anordnung des untergeordneten Fensters

Eine MDI-Anwendung steuert die Größe und Position der untergeordneten Fenster, indem sie Nachrichten an das MDI-Clientfenster sendet. Um das aktive untergeordnete Fenster zu maximieren, sendet die Anwendung die WM_MDIMAXIMIZE Nachricht an das Clientfenster. Wenn ein untergeordnetes Fenster maximiert wird, füllt sein Clientbereich das MDI-Clientfenster vollständig aus. Darüber hinaus blendet das System automatisch die Titelleiste des untergeordneten Fensters aus und fügt der Menüleiste der MDI-Anwendung das Menüsymbol des untergeordneten Fensters und die Schaltfläche Wiederherstellen hinzu. Die Anwendung kann das Clientfenster auf seine ursprüngliche (vormaximierte) Größe und Position wiederherstellen, indem dem Clientfenster eine WM_MDIRESTORE Nachricht gesendet wird.

Eine MDI-Anwendung kann ihre untergeordneten Fenster entweder in einem Kaskaden- oder Kachelformat anordnen. Wenn die untergeordneten Fenster kaskadiert werden, werden die Fenster in einem Stapel angezeigt. Das Fenster am unteren Rand des Stapels nimmt die obere linke Ecke des Bildschirms ein, und die restlichen Fenster sind vertikal und horizontal versetzt, sodass der linke Rahmen und die Titelleiste jedes untergeordneten Fensters sichtbar sind. Um untergeordnete Fenster im Kaskadenformat anzuordnen, sendet eine MDI-Anwendung die WM_MDICASCADE Nachricht. In der Regel sendet die Anwendung diese Meldung, wenn der Benutzer im Fenstermenü auf Cascade klickt.

Wenn die untergeordneten Fenster gekachelt sind, zeigt das System jedes untergeordnete Fenster in seiner Gesamtheit an – und überschneidet keines der Fenster. Alle Fenster sind nach Bedarf so groß, dass sie in das Clientfenster passen. Um untergeordnete Fenster im Kachelformat anzuordnen, sendet eine MDI-Anwendung eine WM_MDITILE Nachricht an das Clientfenster. In der Regel sendet die Anwendung diese Meldung, wenn der Benutzer im Fenstermenü auf Kachel klickt.

Eine MDI-Anwendung sollte für jeden unterstützten untergeordneten Fenstertyp ein anderes Symbol bereitstellen. Die Anwendung gibt beim Registrieren der untergeordneten Fensterklasse ein Symbol an. Das System zeigt automatisch das Symbol eines untergeordneten Fensters im unteren Teil des Clientfensters an, wenn das untergeordnete Fenster minimiert wird. Eine MDI-Anwendung weist das System an, untergeordnete Fenstersymbole anzuordnen, indem eine WM_MDIICONARRANGE Nachricht an das Clientfenster gesendet wird. In der Regel sendet die Anwendung diese Meldung, wenn der Benutzer im Fenstermenü auf Symbole anordnen klickt.

Symbol Titelfenster

Da untergeordnete MDI-Fenster möglicherweise minimiert werden, muss eine MDI-Anwendung verhindern, dass Symboltitelfenster so manipuliert werden, als ob es sich um normale untergeordnete MDI-Fenster handelte. Symboltitelfenster werden angezeigt, wenn die Anwendung untergeordnete Fenster des MDI-Clientfensters auflistet. Symboltitelfenster unterscheiden sich von anderen untergeordneten Fenstern jedoch dadurch, dass sie sich im Besitz eines untergeordneten MDI-Fensters befinden.

Um zu bestimmen, ob ein untergeordnetes Fenster ein Symboltitelfenster ist, verwenden Sie die GetWindow-Funktion mit dem GW_OWNER Index. Fenster ohne Titel geben NULL zurück. Beachten Sie, dass dieser Test für Fenster der obersten Ebene nicht ausreichend ist, da Menüs und Dialogfelder Fenster besitzen.

Daten des untergeordneten Fensters

Da die Anzahl untergeordneter Fenster abhängig davon variiert, wie viele Dokumente der Benutzer öffnet, muss eine MDI-Anwendung in der Lage sein, jedem untergeordneten Fenster Daten (z. B. den Namen der aktuellen Datei) zuzuordnen. Hierfür gibt es zwei Möglichkeiten:

  • Speichern Sie die Daten des untergeordneten Fensters in der Fensterstruktur.
  • Verwenden Sie Fenstereigenschaften.

Fensterstruktur

Wenn eine MDI-Anwendung eine Fensterklasse registriert, reserviert sie möglicherweise zusätzlichen Speicherplatz in der Fensterstruktur für Anwendungsdaten, die für diese bestimmte Windows-Klasse spezifisch sind. Zum Speichern und Abrufen von Daten in diesem zusätzlichen Bereich verwendet die Anwendung die Funktionen GetWindowLong und SetWindowLong .

Um eine große Menge an Daten für ein untergeordnetes Fenster zu verwalten, kann eine Anwendung Arbeitsspeicher für eine Datenstruktur zuweisen und das Handle dann im Arbeitsspeicher speichern, der die Struktur enthält, in dem zusätzlichen Platz, der dem untergeordneten Fenster zugeordnet ist.

Fenstereigenschaften

Eine MDI-Anwendung kann auch Dokumentbezogene Daten mithilfe von Fenstereigenschaften speichern. Dokumentbezogene Daten sind Daten, die für den Dokumenttyp in einem bestimmten untergeordneten Fenster spezifisch sind. Eigenschaften unterscheiden sich von zusätzlichem Speicherplatz in der Fensterstruktur dadurch, dass Sie beim Registrieren der Fensterklasse keinen zusätzlichen Speicherplatz zuweisen müssen. Ein Fenster kann eine beliebige Anzahl von Eigenschaften aufweisen. Wenn Offsets für den Zugriff auf den zusätzlichen Raum in Fensterstrukturen verwendet werden, werden Eigenschaften auch durch Zeichenfolgennamen referenziert. Weitere Informationen zu Fenstereigenschaften finden Sie unter Fenstereigenschaften.