Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Jedes Dokument in einer MDI-Anwendung (Multiple-Document Interface) wird in einem separaten untergeordneten Fenster im Clientbereich des Hauptfensters der Anwendung angezeigt. Typische MDI-Anwendungen umfassen Textverarbeitungsanwendungen, mit denen der Benutzer mit mehreren Textdokumenten arbeiten kann, und Tabellenkalkulationsanwendungen, mit denen der Benutzer mit mehreren Diagrammen und Kalkulationstabellen arbeiten kann. Weitere Informationen finden Sie in den nachfolgenden Themen.
- Frame-, Client- und Kindfenster
- Erstellung untergeordneter Fenster
- Aktivierung eines untergeordneten Fensters
- Mehrere Dokumentmenüs
- Mehrere Dokumentbeschleuniger
- Größe und Anordnung des Kindfensters
- Symboltitel Windows
- Untergeordnete Fensterdaten
Frame-, Client- und Kinderfenster
Eine MDI-Anwendung verfügt über drei Arten von Fenstern: ein Rahmenfenster, ein MDI-Clientfenster sowie eine Reihe untergeordneter Fenster. Das Rahmenfenster ähnelt dem Hauptfenster der Anwendung: Es verfügt über einen Rahmen, eine Titelleiste, ein Fenstermenü, eine Schaltfläche zum Minimieren und eine Maximierungsschaltfläche. Die Anwendung muss eine Fensterklasse für das Rahmenfenster registrieren und eine Fensterprozedur bereitstellen, um sie zu unterstützen.
Eine MDI-Anwendung zeigt keine Ausgabe im Clientbereich des Framefensters an. Stattdessen wird das MDI-Clientfenster angezeigt. Ein MDI-Clientfenster ist ein spezieller Typ untergeordneter Fenster, der zur vorregistern Fensterklasse MDICLIENT gehört. Das Clientfenster ist ein untergeordnetes Element des Rahmenfensters und dient als Hintergrund für untergeordnete Fenster. Es bietet auch Unterstützung für das Erstellen und Manipulieren von untergeordneten Fenstern. Beispielsweise kann eine MDI-Anwendung Kindfenster erstellen, aktivieren oder maximieren, indem Nachrichten an das MDI-Clientfenster gesendet werden.
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 Rahmen zur Größenanpassung, eine Titelleiste, ein Fenstermenü, eine Schaltfläche zum Minimieren und eine Schaltfläche zum 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 Arten von Dokumenten unterstützen. Beispielsweise ermöglicht eine typische Tabellenkalkulationsanwendung dem Benutzer die Arbeit mit Diagrammen und Kalkulationstabellen. Für jeden Dokumenttyp, den es unterstützt, muss eine MDI-Anwendung eine untergeordnete Fensterklasse registrieren und eine Fensterprozedur bereitstellen, um die Fenster dieser Klasse zu unterstützen. Weitere Informationen zu Fensterklassen finden Sie unter "Fensterklassen". Weitere Informationen zu Fensterprozeduren finden Sie unter "Window Procedures".
Es folgt eine typische MDI-Anwendung. Es heißt Multipad.
Erstellung untergeordneter Fenster
Zum Erstellen eines untergeordneten Fensters 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 Formatvorlage anzugeben.
Um ein untergeordnetes Fenster zu entfernen, sendet eine MDI-Anwendung eine WM_MDIDESTROY-Nachricht an das MDI-Clientfenster.
Aktivierung des Kindfensters
Eine beliebige Anzahl untergeordneter Fenster kann jederzeit im Clientfenster angezeigt werden, aber nur ein Fenster kann aktiv sein. Das aktive untergeordnete Fenster wird vor allen anderen untergeordneten Fenstern positioniert, und dessen Rahmen wird 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, die aktiviert werden soll, und an die Fensterprozedur des untergeordneten Fensters, das deaktiviert wird.
Um zu verhindern, dass ein untergeordnetes Fenster aktiviert wird, behandeln Sie die WM_NCACTIVATE Nachricht an das untergeordnete Fenster, indem Sie FALSE zurückgeben.
Das System verfolgt und speichert die Position jedes Kindfensters im Stapel von überlappenden Fenstern. Diese Stapelung wird als Z-Reihenfolge 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 zum aktiven Kindfenster 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 innerhalb des Clientfensters 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 Fenster im Clientfenster vollständig angezeigt wird. |
| Kaskade | Ordnet untergeordnete Fenster in einem Kaskadenformat an. Die untergeordneten Fenster überlappen einander, aber die Titelleiste jedes einzelnen Fensters ist sichtbar. |
| Symbole anordnen | Ordnet die Symbole von minimierten Unterfenstern am unteren Rand des Clientfensters an. |
| Alle schließen | Schließt alle untergeordneten Fenster. |
Jedes Mal, wenn ein untergeordnetes Fenster erstellt wird, fügt das System automatisch ein neues Menüelement an das Fenstermenü an. Der Text des Menüelements entspricht dem Text auf der Menüleiste des neuen untergeordneten Fensters. 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 bis zu zehn Menüelemente zum Fenstermenü hinzufügen. Wenn das zehnte untergeordnete Fenster erstellt wird, fügt das System dem Fenstermenü das Element "Mehr 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 MDI-Kindfenster. Der Benutzer kann ein untergeordnetes Fenster aktivieren, indem er im Listenfeld auf seinen 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. Geben Sie dazu separate Menüressourcen für jeden Typ des Unterfensters an, das von der Anwendung unterstützt wird. Wenn ein neuer Typ untergeordnetes 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, verhält sich die Tasten anders als beim Navigieren durch die Menüs einer typischen Anwendung. In einer MDI-Anwendung wechselt die Kontrolle vom Fenstermenü der Anwendung zum Fenstermenü des aktiven untergeordneten Fensters und dann zum ersten Element der Menüleiste.
Mehrere Dokumentbeschleuniger
Um Tastenkombinationen für die untergeordneten Fenster zu empfangen und zu verarbeiten, muss eine MDI-Anwendung die TranslateMDISysAccel-Funktion in der zugehörigen Nachrichtenschleife enthalten. Die Schleife muss TranslateMDISysAccel aufrufen, bevor die TranslateAccelerator - oder DispatchMessage-Funktion aufgerufen wird.
Tastenkombinationen im Fenstermenü für ein untergeordnetes MDI-Fenster unterscheiden sich von denen für ein nicht-MDI-untergeordnetes 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 Kindfensters
Eine MDI-Anwendung steuert die Größe und Position der untergeordneten Fenster, indem Nachrichten an das MDI-Clientfenster gesendet werden. 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 der Clientbereich das MDI-Clientfenster vollständig aus. Darüber hinaus blendet das System automatisch die Titelleiste des untergeordneten Fensters aus und fügt das Fenstermenüsymbol und die Schaltfläche "Wiederherstellen" in die Menüleiste der MDI-Anwendung hinzu. Die Anwendung kann das Clientfenster auf seine ursprüngliche (vorher maximierte) Größe und Position wiederherstellen, indem eine WM_MDIRESTORE-Nachricht an das Clientfenster gesendet wird.
Eine MDI-Anwendung kann ihre untergeordneten Fenster entweder im 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 verbleibenden Fenster werden 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 Nachricht, wenn der Benutzer im Fenstermenü auf "Cascade " klickt.
Wenn die untergeordneten Fenster nebeneinander angeordnet sind, zeigt das System jedes untergeordnete Fenster in seiner Gesamtheit an – überlappend keines der Fenster. Alle Fenster werden bei Bedarf so angepasst, 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 Nachricht, wenn der Benutzer im Fenstermenü auf "Kachel " klickt.
Eine MDI-Anwendung sollte für jeden unterstützten Unterfenstertyp ein anderes Symbol bereitstellen. Die Anwendung gibt ein Symbol beim Registrieren der untergeordneten Fensterklasse 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, Kinderfenstersymbole anzuordnen, indem eine WM_MDIICONARRANGE-Nachricht an das Clientfenster gesendet wird. In der Regel sendet die Anwendung diese Nachricht, wenn der Benutzer im Fenstermenü auf "Symbole anordnen" klickt.
Symboltitel Windows
Da untergeordnete MDI-Fenster möglicherweise minimiert werden können, muss eine MDI-Anwendung das Bearbeiten von Symboltitelfenstern vermeiden, als wären sie normale untergeordnete MDI-Fenster. Symboltitelfenster werden angezeigt, wenn die Anwendung untergeordnete Fenster des MDI-Clientfensters aufzählt. Symboltitelfenster unterscheiden sich jedoch von anderen untergeordneten Fenstern, da sie einem untergeordneten MDI-Fenster gehören.
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 ausreicht, da Menüs und Dialogfelder Fenster besitzen.
Untergeordnete Fensterdaten
Da die Anzahl der untergeordneten Fenster abhängig davon variiert, wie viele Dokumente der Benutzer öffnet, muss eine MDI-Anwendung Daten (z. B. den Namen der aktuellen Datei) jedem untergeordneten Fenster zuordnen können. Sie können auf zwei Arten vorgehen:
- Speichern Sie die Daten des untergeordneten Fensters in der Fensterstruktur.
- Verwenden Sie Fenstereigenschaften.
Fensterstruktur
Wenn eine MDI-Anwendung eine Fensterklasse registriert, kann sie zusätzlichen Platz in der Fensterstruktur für Anwendungsdaten reservieren, die für diese bestimmte Klasse von Fenstern 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 Datenmenge für ein untergeordnetes Fenster beizubehalten, kann eine Anwendung Speicher für eine Datenstruktur zuweisen und dann das Handle im Arbeitsspeicher speichern, der die Struktur im zusätzlichen Bereich enthält, der dem untergeordneten Fenster zugeordnet ist.
Fenstereigenschaften
Eine MDI-Anwendung kann daten pro Dokument auch mithilfe von Fenstereigenschaften speichern. Dokumentbezogene Daten sind datenspezifisch für den Dokumenttyp, der in einem bestimmten untergeordneten Fenster enthalten ist. Eigenschaften unterscheiden sich von zusätzlichem Platz in der Fensterstruktur, da Sie beim Registrieren der Fensterklasse keinen zusätzlichen Platz zuweisen müssen. Ein Fenster kann eine beliebige Anzahl von Eigenschaften aufweisen. Wenn Offsets auch für den Zugriff auf den zusätzlichen Platz in Fensterstrukturen verwendet werden, werden Eigenschaften durch Stringnamen angesprochen. Weitere Informationen zu Fenstereigenschaften finden Sie unter "Fenstereigenschaften".