Fensterfeatures
In dieser Übersicht werden Features von Fenstern wie Fenstertypen, Zuständen, Größe und Position erläutert.
- Fenstertypen
- Fensterbeziehungen
- Fensterstatus anzeigen
- Fenstergröße und -position
- Fensteranimation
- Fensterlayout und Spiegelung
- Fenstervernichtung
Fenstertypen
Dieser Abschnitt enthält die folgenden Themen, die Fenstertypen beschreiben.
Überlappende Fenster
Ein überlappende Fenster ist ein Fenster der obersten Ebene (nicht untergeordnetes Fenster), das eine Titelleiste, einen Rahmen und einen Clientbereich aufweist; sie dient als Hauptfenster einer Anwendung. Es kann auch über ein Fenstermenü verfügen, Schaltflächen minimieren und maximieren sowie Bildlaufleisten. Ein überlappende Fenster, das als Hauptfenster verwendet wird, enthält in der Regel alle diese Komponenten.
Durch Angeben der WS_OVERLAPPED oder WS_OVERLAPPEDWINDOW Formatvorlage in der CreateWindowEx--Funktion erstellt eine Anwendung ein überlappende Fenster. Wenn Sie die WS_OVERLAPPED Formatvorlage verwenden, weist das Fenster eine Titelleiste und einen Rahmen auf. Wenn Sie die WS_OVERLAPPEDWINDOW Formatvorlage verwenden, verfügt das Fenster über eine Titelleiste, einen Rahmen, ein Fenstermenü und schaltflächen zum Minimieren und Maximieren.
Popupfenster
Ein Popupfenster ist ein spezieller Typ überlappender Fenster, der für Dialogfelder, Meldungsfelder und andere temporäre Fenster verwendet wird, die außerhalb des Hauptfensters einer Anwendung angezeigt werden. Titelleisten sind optional für Popupfenster; andernfalls sind Popupfenster identisch mit überlappenden Fenstern des WS_OVERLAPPED-Stils.
Sie erstellen ein Popupfenster, indem Sie die WS_POPUP Formatvorlage in CreateWindowExangeben. Um eine Titelleiste einzuschließen, geben Sie die WS_CAPTION Formatvorlage an. Verwenden Sie die WS_POPUPWINDOW Formatvorlage, um ein Popupfenster zu erstellen, das einen Rahmen und ein Fenstermenü aufweist. Die WS_CAPTION Formatvorlage muss mit der WS_POPUPWINDOW Formatvorlage kombiniert werden, um das Fenstermenü sichtbar zu machen.
Untergeordnetes Windows
Ein untergeordnetes Fenster weist die WS_CHILD Formatvorlage auf und ist auf den Clientbereich des übergeordneten Fensters beschränkt. Eine Anwendung verwendet in der Regel untergeordnete Fenster, um den Clientbereich eines übergeordneten Fensters in Funktionsbereiche aufzuteilen. Sie erstellen ein untergeordnetes Fenster, indem Sie die WS_CHILD Formatvorlage in der CreateWindowEx--Funktion angeben.
Ein untergeordnetes Fenster muss über ein übergeordnetes Fenster verfügen. Das übergeordnete Fenster kann ein überlappende Fenster, ein Popupfenster oder sogar ein anderes untergeordnetes Fenster sein. Sie geben das übergeordnete Fenster an, wenn Sie CreateWindowExaufrufen. Wenn Sie die WS_CHILD Formatvorlage in CreateWindowEx- angeben, aber kein übergeordnetes Fenster angeben, erstellt das System das Fenster nicht.
Ein untergeordnetes Fenster verfügt über einen Clientbereich, aber keine anderen Features, es sei denn, sie werden explizit angefordert. Eine Anwendung kann eine Titelleiste, ein Fenstermenü, Schaltflächen minimieren und maximieren, einen Rahmen und Bildlaufleisten für ein untergeordnetes Fenster anfordern, aber ein untergeordnetes Fenster kann nicht über ein Menü verfügen. Wenn die Anwendung ein Menühandle angibt, wird das Menühandle ignoriert, wenn sie die Fensterklasse des untergeordneten Elements registriert oder das untergeordnete Fenster erstellt. Wenn keine Rahmenart angegeben ist, erstellt das System ein rahmenloses Fenster. Eine Anwendung kann rahmenlose untergeordnete Fenster verwenden, um den Clientbereich eines übergeordneten Fensters zu dividieren und die Abteilungen für den Benutzer unsichtbar zu halten.
In diesem Abschnitt werden die folgenden Aspekte untergeordneter Fenster erläutert:
Positionierung
Das System positioniert immer ein untergeordnetes Fenster relativ zur oberen linken Ecke des Clientbereichs des übergeordneten Fensters. Kein Teil eines untergeordneten Fensters wird jemals außerhalb der Rahmen des übergeordneten Fensters angezeigt. Wenn eine Anwendung ein untergeordnetes Fenster erstellt, das größer als das übergeordnete Fenster ist oder ein untergeordnetes Fenster positioniert, sodass sich einige oder alle untergeordneten Fenster über die Rahmen des übergeordneten Fensters erstrecken, klammert das System das untergeordnete Fenster ab; d. h., der Teil außerhalb des Clientbereichs des übergeordneten Fensters wird nicht angezeigt. Aktionen, die sich auf das übergeordnete Fenster auswirken, können sich auch auf das untergeordnete Fenster wie folgt auswirken.
Übergeordnetes Fenster | Untergeordnetes Fenster |
---|---|
Zerstört | Zerstört, bevor das übergeordnete Fenster zerstört wird. |
Versteckt | Ausgeblendet, bevor das übergeordnete Fenster ausgeblendet ist. Ein untergeordnetes Fenster ist nur sichtbar, wenn das übergeordnete Fenster sichtbar ist. |
Bewegt | Mit dem Clientbereich des übergeordneten Fensters verschoben. Das untergeordnete Fenster ist für das Zeichnen des Kundenbereichs nach dem Verschieben verantwortlich. |
Gezeigt | Wird angezeigt, nachdem das übergeordnete Fenster angezeigt wurde. |
Ausschnitt
Das System beschnitt kein untergeordnetes Fenster aus dem Clientbereich des übergeordneten Fensters. Dies bedeutet, dass das übergeordnete Fenster über das untergeordnete Fenster gezeichnet wird, wenn eine Zeichnung an derselben Position wie das untergeordnete Fenster ausgeführt wird. Das System beschnitt jedoch das untergeordnete Fenster aus dem Clientbereich des übergeordneten Fensters, wenn das übergeordnete Fenster die WS_CLIPCHILDREN Formatvorlage aufweist. Wenn das untergeordnete Fenster abgeschnitten ist, kann das übergeordnete Fenster nicht über das Fenster gezeichnet werden.
Ein untergeordnetes Fenster kann andere untergeordnete Fenster im selben Clientbereich überlappen. Ein untergeordnetes Fenster, das dasselbe übergeordnete Fenster wie ein oder mehrere andere untergeordnete Fenster gemeinsam verwendet, wird als gleichgeordnetes Fensterbezeichnet. Gleichgeordnete Fenster können im Clientbereich der anderen zeichnen, es sei denn, eines der untergeordneten Fenster weist die WS_CLIPSIBLINGS Format auf. Wenn ein untergeordnetes Fenster diese Formatvorlage aufweist, wird ein Teil des gleichgeordneten Fensters, der sich im untergeordneten Fenster befindet, abgeschnitten.
Wenn ein Fenster entweder das WS_CLIPCHILDREN oder WS_CLIPSIBLINGS Format aufweist, tritt ein leichter Leistungsverlust auf. Jedes Fenster verwendet Systemressourcen, sodass eine Anwendung keine untergeordneten Fenster diskriminiert verwenden sollte. Um eine optimale Leistung zu erzielen, sollte eine Anwendung, die das Hauptfenster logisch unterteilen muss, dies in der Fensterprozedur des Hauptfensters tun, anstatt untergeordnete Fenster zu verwenden.
Beziehung zum übergeordneten Fenster
Eine Anwendung kann das übergeordnete Fenster eines vorhandenen untergeordneten Fensters ändern, indem die SetParent-Funktion aufgerufen wird. In diesem Fall entfernt das System das untergeordnete Fenster aus dem Clientbereich des alten übergeordneten Fensters und verschiebt es in den Clientbereich des neuen übergeordneten Fensters. Wenn SetParent- ein NULL- Handle angibt, wird das Desktopfenster zum neuen übergeordneten Fenster. In diesem Fall wird das untergeordnete Fenster auf dem Desktop außerhalb der Rahmen eines anderen Fensters gezeichnet. Die GetParent--Funktion ruft ein Handle zum übergeordneten Fenster eines untergeordneten Fensters ab.
Das übergeordnete Fenster ordnet einen Teil seines Clientbereichs einem untergeordneten Fenster zu, und das untergeordnete Fenster empfängt alle Eingaben aus diesem Bereich. Die Fensterklasse muss für jedes untergeordnete Fenster des übergeordneten Fensters nicht identisch sein. Dies bedeutet, dass eine Anwendung ein übergeordnetes Fenster mit untergeordneten Fenstern ausfüllen kann, die unterschiedlich aussehen und verschiedene Aufgaben ausführen. Beispielsweise kann ein Dialogfeld viele Arten von Steuerelementen enthalten, jedes ein untergeordnetes Fenster, das verschiedene Datentypen vom Benutzer akzeptiert.
Ein untergeordnetes Fenster hat nur ein übergeordnetes Fenster, ein übergeordnetes Fenster kann jedoch eine beliebige Anzahl untergeordneter Fenster aufweisen. Jedes untergeordnete Fenster wiederum kann untergeordnete Fenster haben. In dieser Fensterkette wird jedes untergeordnete Fenster als untergeordnetes Fenster des ursprünglichen übergeordneten Fensters bezeichnet. Eine Anwendung verwendet die IsChild--Funktion, um zu ermitteln, ob ein bestimmtes Fenster ein untergeordnetes Fenster oder ein untergeordnetes Fenster eines bestimmten übergeordneten Fensters ist.
Die EnumChildWindows--Funktion listet die untergeordneten Fenster eines übergeordneten Fensters auf. Anschließend übergibt EnumChildWindows das Handle an jedes untergeordnete Fenster an eine anwendungsdefinierte Rückruffunktion. Untergeordnete Fenster des angegebenen übergeordneten Fensters werden ebenfalls aufgezählt.
Meldungen
Das System übergibt die Eingabemeldungen eines untergeordneten Fensters direkt an das untergeordnete Fenster; die Nachrichten werden nicht über das übergeordnete Fenster übergeben. Die einzige Ausnahme ist, wenn das untergeordnete Fenster von der EnableWindow-Funktion deaktiviert wurde. In diesem Fall übergibt das System alle Eingabemeldungen, die stattdessen zum untergeordneten Fenster an das übergeordnete Fenster gegangen wären. Dadurch kann das übergeordnete Fenster die Eingabemeldungen untersuchen und ggf. das untergeordnete Fenster aktivieren.
Ein untergeordnetes Fenster kann einen eindeutigen ganzzahligen Bezeichner aufweisen. Untergeordnete Fensterbezeichner sind beim Arbeiten mit Steuerelementfenstern wichtig. Eine Anwendung leitet die Aktivität eines Steuerelements durch Senden von Nachrichten weiter. Die Anwendung verwendet den untergeordneten Fensterbezeichner des Steuerelements, um die Nachrichten an das Steuerelement zu leiten. Darüber hinaus sendet ein Steuerelement Benachrichtigungen an das übergeordnete Fenster. Eine Benachrichtigung enthält den untergeordneten Fensterbezeichner des Steuerelements, den das übergeordnete Element verwendet, um zu identifizieren, welches Steuerelement die Nachricht gesendet hat. Eine Anwendung gibt den Bezeichner für untergeordnete Fenster für andere Typen untergeordneter Fenster an, indem der hMenu Parameter der CreateWindowEx--Funktion auf einen Wert und nicht auf ein Menühandle festgelegt wird.
Mehrschichtige Fenster
Die Verwendung eines mehrschichtigen Fensters kann die Leistung und visuelle Effekte für ein Fenster mit komplexer Form erheblich verbessern, seine Form animiert oder Alphamischungseffekte verwenden. Das System erstellt automatisch überschichtete Fenster und die Fenster zugrunde liegender Anwendungen. Daher werden layerierte Fenster reibungslos gerendert, ohne dass die typischen komplexen Fensterbereiche flimmern. Darüber hinaus können mehrschichtige Fenster teilweise transluzent sein, d. h. alphavermischungt.
Zum Erstellen eines Ebenenfensters geben Sie beim Aufrufen der CreateWindowEx--Funktion den WS_EX_LAYERED erweiterten Fensterstil an, oder rufen Sie die SetWindowLong--Funktion auf, um WS_EX_LAYERED festzulegen, nachdem das Fenster erstellt wurde. Nach dem Aufruf des CreateWindowEx wird das Layerfenster erst angezeigt, wenn die SetLayeredWindowAttributes oder UpdateLayeredWindow-Funktion für dieses Fenster aufgerufen wurde.
Anmerkung
Ab Windows 8 können WS_EX_LAYERED mit untergeordneten Fenstern und Fenstern der obersten Ebene verwendet werden. Frühere Windows-Versionen unterstützen WS_EX_LAYERED nur für Fenster der obersten Ebene.
Rufen Sie SetLayeredWindowAttributesauf, um die Deckkraftstufe oder den Transparenzfarbschlüssel für ein bestimmtes ebenen Fenster festzulegen. Nach dem Aufruf bittet das System das Fenster möglicherweise trotzdem, zu zeichnen, wenn das Fenster angezeigt oder die Größe geändert wird. Da das System jedoch das Bild eines mehrschichtigen Fensters speichert, fordert das System das Fenster nicht auf, zu zeichnen, wenn Teile davon als Ergebnis relativer Fensterverschiebungen auf dem Desktop angezeigt werden. Legacyanwendungen müssen ihren Zeichencode nicht neu strukturieren, wenn sie Transluz- oder Transparenzeffekte für ein Fenster hinzufügen möchten, da das System die Zeichnung von Fenstern umleitet, die SetLayeredWindowAttributes in off-screen-Speicher aufgerufen und es neu kompensiert, um den gewünschten Effekt zu erzielen.
Rufen Sie UpdateLayeredWindowauf, um eine schnellere und effizientere Animation zu erreichen, wenn pro Pixel Alpha erforderlich ist. UpdateLayeredWindow sollte hauptsächlich verwendet werden, wenn die Anwendung die Form und den Inhalt eines layerierten Fensters direkt bereitstellen muss, ohne den Umleitungsmechanismus zu verwenden, den das System über SetLayeredWindowAttributesbereitstellt. Darüber hinaus verwendet die Verwendung von UpdateLayeredWindow arbeitsspeichereffizienter, da das System nicht den zusätzlichen Arbeitsspeicher benötigt, der zum Speichern des Bilds des umgeleiteten Fensters erforderlich ist. Rufen Sie für maximale Effizienz beim Animieren von Fenstern UpdateLayeredWindow auf, um die Position und die Größe eines mehrschichtigen Fensters zu ändern. Bitte beachten Sie, dass nach dem Aufruf SetLayeredWindowAttributes nachfolgende UpdateLayeredWind ow-Aufrufe fehlschlagen, bis das Layering style bit gelöscht und erneut festgelegt wird.
Treffertests für ein mehrschichtiges Fenster basieren auf der Form und Transparenz des Fensters. Dies bedeutet, dass die Bereiche des Fensters, die mit Farbtasten versehen sind oder deren Alphawert 0 ist, die Mausmeldungen durchlaufen lassen. Wenn das überschichtete Fenster jedoch das WS_EX_TRANSPARENT erweiterten Fensterformat aufweist, wird die Form des überschichteten Fensters ignoriert, und die Mausereignisse werden an andere Fenster unterhalb des gestreckten Fensters übergeben.
Message-Only Windows
Ein Nur-Nachrichten-Fenster ermöglicht es Ihnen, Nachrichten zu senden und zu empfangen. Sie ist nicht sichtbar, hat keine Z-Reihenfolge, kann nicht aufgezählt werden und empfängt keine Übertragungsnachrichten. Das Fenster versendet einfach Nachrichten.
Zum Erstellen eines schreibgeschützten Fensters geben Sie die HWND_MESSAGE Konstante oder ein Handle für ein vorhandenes Nur-Nachrichten-Fenster im hWndParent Parameter der CreateWindowEx--Funktion an. Sie können ein vorhandenes Fenster auch in ein Nur-Nachrichten-Fenster ändern, indem Sie HWND_MESSAGE im hWndNewParent Parameter der funktion SetParent angeben.
Geben Sie HWND_MESSAGE im hwndParent Parameter der FindWindowEx--Funktion an, um nur Nachrichtenfenster zu finden. Darüber hinaus durchsucht FindWindowEx- Nur-Nachrichtenfenster sowie Fenster der obersten Ebene, wenn sowohl die hwndParent als auch hwndChildAfter-Parameter NULL-sind.
Fensterbeziehungen
Es gibt viele Möglichkeiten, wie ein Fenster mit dem Benutzer oder einem anderen Fenster zusammenhängen kann. Bei einem Fenster kann es sich um ein eigenes Fenster, ein Vordergrundfenster oder ein Hintergrundfenster handelt. Ein Fenster hat auch eine Z-Reihenfolge relativ zu anderen Fenstern. Weitere Informationen finden Sie in den folgenden Themen:
Vordergrund- und Hintergrundfenster
Jeder Prozess kann über mehrere Ausführungsthreads verfügen, und jeder Thread kann Fenster erstellen. Der Thread, der das Fenster erstellt hat, mit dem der Benutzer gerade arbeitet, wird als Vordergrundthread bezeichnet, und das Fenster wird als Vordergrundfensterbezeichnet. Alle anderen Threads sind Hintergrundthreads, und die von Hintergrundthreads erstellten Fenster werden Hintergrundfensteraufgerufen.
Jeder Thread verfügt über eine Prioritätsebene, die die CPU-Zeit bestimmt, die der Thread empfängt. Obwohl eine Anwendung die Prioritätsebene ihrer Threads festlegen kann, weist der Vordergrundthread normalerweise eine etwas höhere Prioritätsstufe als die Hintergrundthreads auf. Da sie eine höhere Priorität hat, erhält der Vordergrundthread mehr CPU-Zeit als die Hintergrundthreads. Der Vordergrundthread hat eine normale Basispriorität von 9; Ein Hintergrundthread hat eine normale Basispriorität von 7.
Der Benutzer legt das Vordergrundfenster fest, indem er auf ein Fenster klickt oder die Tastenkombination ALT+TAB oder ALT+ESC verwendet. Um ein Handle für das Vordergrundfenster abzurufen, verwenden Sie die GetForegroundWindow-Funktion. Um zu überprüfen, ob das Anwendungsfenster das Vordergrundfenster ist, vergleichen Sie das von GetForegroundWindow- zurückgegebene Handle mit dem des Anwendungsfensters.
Eine Anwendung legt das Vordergrundfenster mithilfe der SetForegroundWindow--Funktion fest.
Das System schränkt ein, welche Prozesse das Vordergrundfenster festlegen können. Ein Prozess kann das Vordergrundfenster nur dann festlegen, wenn:
- Alle folgenden Bedingungen gelten:
- Der Prozessaufruf SetForegroundWindow gehört zu einer Desktopanwendung, nicht zu einer UWP-App oder einer Windows Store-App, die für Windows 8 oder 8.1 entwickelt wurde.
- Der Vordergrundprozess hat keine Aufrufe an SetForegroundWindow durch einen vorherigen Aufruf der LockSetForegroundWindow-Funktion deaktiviert.
- Das Zeitlimit für die Vordergrundsperre ist abgelaufen (siehe SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
- Es sind keine Menüs aktiv.
- Darüber hinaus gilt mindestens eine der folgenden Bedingungen:
- Der aufrufende Prozess ist der Vordergrundprozess.
- Der Aufrufvorgang wurde vom Vordergrundprozess gestartet.
- Es gibt derzeit kein Vordergrundfenster und somit keinen Vordergrundprozess.
- Der aufrufende Prozess hat das letzte Eingabeereignis empfangen.
- Entweder der Vordergrundprozess oder der aufrufende Prozess wird gedebuggt.
Es ist möglich, dass einem Prozess das Recht verweigert wird, das Vordergrundfenster festzulegen, auch wenn er diese Bedingungen erfüllt.
Ein Prozess, der das Vordergrundfenster festlegen kann, kann es einem anderen Prozess ermöglichen, das Vordergrundfenster festzulegen, indem die AllowSetForegroundWindow--Funktion aufgerufen wird, oder indem die BroadcastSystemMessage--Funktion mit der BSF_ALLOWSFW-Kennzeichnung aufgerufen wird. Der Vordergrundprozess kann Aufrufe von SetForegroundWindow- durch Aufrufen der LockSetForegroundWindow--Funktion deaktivieren.
Windows im Besitz
Ein überlappende oder Popupfenster kann einem anderen überlappenden oder Popupfenster gehören. Im Besitz befinden sich mehrere Einschränkungen in einem Fenster.
- Ein eigenes Fenster befindet sich immer über seinem Besitzer in der Z-Bestellung.
- Das System zerstört automatisch ein eigenes Fenster, wenn sein Besitzer zerstört wird.
- Ein eigenes Fenster ist ausgeblendet, wenn der Besitzer minimiert wird.
Nur ein überlappende oder Popupfenster kann ein Besitzerfenster sein; Ein untergeordnetes Fenster kann kein Besitzerfenster sein. Eine Anwendung erstellt ein eigenes Fenster, indem das Fensterhandle des Besitzers als hwndParent Parameter von CreateWindowEx angegeben wird, wenn ein Fenster mit dem WS_OVERLAPPED- oder WS_POPUP-Format erstellt wird. Der hwndParent Parameter muss ein überlappende oder Popupfenster identifizieren. Wenn hwndParent ein untergeordnetes Fenster identifiziert, weist das System dem übergeordneten Fenster der obersten Ebene des untergeordneten Fensters Den Besitz zu. Nach dem Erstellen eines eigenen Fensters kann eine Anwendung den Besitz des Fensters nicht in ein anderes Fenster übertragen.
Dialogfelder und Meldungsfelder besitzen standardmäßig Fenster. Eine Anwendung gibt das Besitzerfenster beim Aufrufen einer Funktion an, die ein Dialogfeld oder Meldungsfeld erstellt.
Eine Anwendung kann die GetWindow--Funktion mit der GW_OWNER-Kennzeichnung verwenden, um einen Handle für den Besitzer eines Fensters abzurufen.
Z-Reihenfolge
Die Z-Reihenfolge eines Fensters gibt die Position des Fensters in einem Stapel überlappender Fenster an. Dieser Fensterstapel ist entlang einer imaginären Achse ausgerichtet, der Z-Achse, die sich vom Bildschirm nach außen erstreckt. Das Fenster oben in der Z-Reihenfolge überlappt alle anderen Fenster. Das Fenster am unteren Rand der Z-Reihenfolge wird von allen anderen Fenstern überlappt.
Das System verwaltet die Z-Reihenfolge in einer einzelnen Liste. Sie fügt fenster zur Z-Reihenfolge hinzu, je nachdem, ob es sich um oberste Fenster, Fenster auf oberster Ebene oder untergeordnete Fenster handelt. Ein oberstes Fenster überlappt alle anderen nicht obersten Fenster, unabhängig davon, ob es sich um das aktive oder Vordergrundfenster handelt. Ein oberstes Fenster weist die WS_EX_TOPMOST Formatvorlage auf. Alle obersten Fenster werden in der Z-Reihenfolge vor allen nicht obersten Fenstern angezeigt. Ein untergeordnetes Fenster wird in Z-Reihenfolge mit dem übergeordneten Fenster gruppiert.
Wenn eine Anwendung ein Fenster erstellt, platziert das System es oben in der Z-Reihenfolge für Fenster desselben Typs. Sie können die BringWindowToTop--Funktion verwenden, um ein Fenster an den Anfang der Z-Reihenfolge für Fenster desselben Typs zu übertragen. Sie können die Z-Reihenfolge mithilfe der funktionen SetWindowPos und DeferWindowPos neu anordnen.
Der Benutzer ändert die Z-Reihenfolge, indem ein anderes Fenster aktiviert wird. Das System positioniert das aktive Fenster oben in der Z-Reihenfolge für Fenster desselben Typs. Wenn ein Fenster oben in der Z-Reihenfolge angezeigt wird, gehen Sie dazu in den untergeordneten Fenstern vor. Sie können die GetTopWindow--Funktion verwenden, um alle untergeordneten Fenster eines übergeordneten Fensters zu durchsuchen und ein Handle an das untergeordnete Fenster zurückzugeben, das in der Z-Reihenfolge am höchsten ist. Die GetNextWindow--Funktion ruft ein Handle zum nächsten oder vorherigen Fenster in z-Reihenfolge ab.
Fenster "Status anzeigen"
Zu einem bestimmten Zeitpunkt kann ein Fenster aktiv oder inaktiv sein; ausgeblendet oder sichtbar; und minimiert, maximiert oder wiederhergestellt. Diese Eigenschaften werden gemeinsam als Fensterzustandbezeichnet. In den folgenden Themen wird der Status der Fensterpräsentation erläutert:
- aktives Fenster
- Deaktivierte Windows-
- Fenstersichtbarkeit
- minimierte, maximierte und wiederhergestellte Windows-
Aktives Fenster
Ein aktives Fenster ist das Fenster der obersten Ebene der Anwendung, mit dem der Benutzer gerade arbeitet. Damit der Benutzer das aktive Fenster leicht identifizieren kann, platziert das System es oben in der Z-Reihenfolge und ändert die Farbe der Titelleiste und den Rahmen in die vom System definierten aktiven Fensterfarben. Nur ein Fenster auf oberster Ebene kann ein aktives Fenster sein. Wenn der Benutzer mit einem untergeordneten Fenster arbeitet, aktiviert das System das übergeordnete Fenster der obersten Ebene, das dem untergeordneten Fenster zugeordnet ist.
Es ist jeweils nur ein Fenster der obersten Ebene im System aktiv. Der Benutzer aktiviert ein Fenster auf oberster Ebene, indem er darauf klickt (oder auf eines seiner untergeordneten Fenster), oder mithilfe der Tastenkombination ALT+ESC oder ALT+TAB. Eine Anwendung aktiviert ein Fenster auf oberster Ebene, indem die SetActiveWindow--Funktion aufgerufen wird. Andere Funktionen können dazu führen, dass das System ein anderes Fenster auf oberster Ebene aktiviert, einschließlich SetWindowPos, DeferWindowPos, SetWindowPlacementund DestroyWindow. Eine Anwendung kann zwar jederzeit ein anderes Fenster auf oberster Ebene aktivieren, um eine Verwirrung des Benutzers zu vermeiden, dies sollte jedoch nur als Reaktion auf eine Benutzeraktion ausgeführt werden. Eine Anwendung verwendet die GetActiveWindow--Funktion, um ein Handle für das aktive Fenster abzurufen.
Wenn sich die Aktivierung von einem Fenster der obersten Ebene einer Anwendung in das Fenster der obersten Ebene eines anderen ändert, sendet das System eine WM_ACTIVATEAPP Nachricht an beide Anwendungen, und benachrichtigt sie über die Änderung. Wenn sich die Aktivierung in einem anderen Fenster der obersten Ebene in derselben Anwendung ändert, sendet das System beide Fenster eine WM_ACTIVATE Nachricht.
Deaktiviertes Windows
Ein Fenster kann deaktiviert werden. Ein deaktiviertes Fenster keine Tastatur- oder Mauseingaben des Benutzers empfängt, kann jedoch Nachrichten von anderen Fenstern, von anderen Anwendungen und vom System empfangen. Eine Anwendung deaktiviert in der Regel ein Fenster, um zu verhindern, dass der Benutzer das Fenster verwendet. Beispielsweise kann eine Anwendung eine Knopfdruckschaltfläche in einem Dialogfeld deaktivieren, um zu verhindern, dass der Benutzer sie auswählt. Eine Anwendung kann jederzeit ein deaktiviertes Fenster aktivieren; Durch aktivieren eines Fensters wird die normale Eingabe wiederhergestellt.
Standardmäßig ist ein Fenster beim Erstellen aktiviert. Eine Anwendung kann jedoch die WS_DISABLED Formatvorlage angeben, um ein neues Fenster zu deaktivieren. Eine Anwendung aktiviert oder deaktiviert ein vorhandenes Fenster mithilfe der EnableWindow--Funktion. Das System sendet eine WM_ENABLE Nachricht an ein Fenster, wenn sich der aktivierte Zustand ändert. Eine Anwendung kann bestimmen, ob ein Fenster mithilfe der IsWindowEnabled--Funktion aktiviert ist.
Wenn ein untergeordnetes Fenster deaktiviert ist, übergibt das System die Mauseingabemeldungen des untergeordneten Elements an das übergeordnete Fenster. Das übergeordnete Element verwendet die Nachrichten, um zu bestimmen, ob das untergeordnete Fenster aktiviert werden soll. Weitere Informationen finden Sie unter Mouse Input.
Nur jeweils ein Fenster kann Tastatureingaben empfangen; Dieses Fenster soll den Tastaturfokus haben. Wenn eine Anwendung die EnableWindow-Funktion verwendet, um ein Tastaturfokusfenster zu deaktivieren, verliert das Fenster den Tastaturfokus zusätzlich zur Deaktivierung. EnableWindow legt dann den Tastaturfokus auf NULL-fest, was bedeutet, dass kein Fenster den Fokus hat. Wenn ein untergeordnetes Fenster oder ein anderes untergeordnetes Fenster den Tastaturfokus hat, verliert das untergeordnete Fenster den Fokus, wenn das übergeordnete Fenster deaktiviert ist. Weitere Informationen finden Sie unter Tastatureingabe.
Fenstersichtbarkeit
Ein Fenster kann entweder sichtbar oder ausgeblendet sein. Das System zeigt ein sichtbares Fenster auf dem Bildschirm an. Es blendet ein ausgeblendetes Fenster aus, indem es nicht gezeichnet wird. Wenn ein Fenster sichtbar ist, kann der Benutzer Eingaben für das Fenster bereitstellen und die Ausgabe des Fensters anzeigen. Wenn ein Fenster ausgeblendet ist, ist es effektiv deaktiviert. Ein ausgeblendetes Fenster kann Nachrichten aus dem System oder aus anderen Fenstern verarbeiten, aber keine Eingaben vom Benutzer oder der Anzeigeausgabe verarbeiten. Eine Anwendung legt den Sichtbarkeitsstatus eines Fensters beim Erstellen des Fensters fest. Später kann die Anwendung den Sichtbarkeitszustand ändern.
Ein Fenster ist sichtbar, wenn die WS_VISIBLE Formatvorlage für das Fenster festgelegt ist. Standardmäßig erstellt die CreateWindowEx--Funktion ein ausgeblendetes Fenster, es sei denn, die Anwendung gibt die WS_VISIBLE Formatvorlage an. In der Regel legt eine Anwendung die WS_VISIBLE Formatvorlage fest, nachdem sie ein Fenster erstellt hat, um Details zum Erstellungsprozess für den Benutzer ausgeblendet zu halten. Beispielsweise kann eine Anwendung ein neues Fenster ausgeblendet lassen, während es das Erscheinungsbild des Fensters angepasst. Wenn die WS_VISIBLE Formatvorlage in CreateWindowEx-angegeben wird, sendet das System die WM_SHOWWINDOW Nachricht nach dem Erstellen des Fensters an das Fenster, aber bevor es angezeigt wird.
Eine Anwendung kann bestimmen, ob ein Fenster mithilfe der IsWindowVisible-Funktion sichtbar ist. Eine Anwendung kann ein Fenster anzeigen (sichtbar machen) oder ein Fenster mithilfe der ShowWindow, SetWindowPos, DeferWindowPosoder SetWindowPlacement- oder SetWindowLong-Funktion ausblenden. Mit diesen Funktionen wird ein Fenster angezeigt oder ausgeblendet, indem sie die WS_VISIBLE Formatvorlage für das Fenster festlegen oder entfernen. Sie senden auch die WM_SHOWWINDOW Nachricht an das Fenster, bevor sie angezeigt oder ausgeblendet wird.
Wenn ein Besitzerfenster minimiert wird, blendet das System automatisch die zugeordneten Fenster aus. Wenn ein Besitzerfenster wiederhergestellt wird, zeigt das System automatisch die zugeordneten Fenster an. In beiden Fällen sendet das System die WM_SHOWWINDOW Nachricht an die eigenen Fenster, bevor sie ausgeblendet oder angezeigt werden. Gelegentlich muss eine Anwendung die eigenen Fenster ausblenden, ohne den Besitzer minimieren oder ausblenden zu müssen. In diesem Fall verwendet die Anwendung die ShowOwnedPopups-Funktion. Diese Funktion legt die WS_VISIBLE Formatvorlage für alle eigenen Fenster fest oder entfernt sie und sendet die WM_SHOWWINDOW Nachricht an die eigenen Fenster, bevor sie ausgeblendet oder angezeigt werden. Das Ausblenden eines Besitzerfensters hat keine Auswirkungen auf den Sichtbarkeitszustand der eigenen Fenster.
Wenn ein übergeordnetes Fenster sichtbar ist, sind auch die zugeordneten untergeordneten Fenster sichtbar. Wenn das übergeordnete Fenster ausgeblendet ist, werden die untergeordneten Fenster ebenfalls ausgeblendet. Das Minimieren des übergeordneten Fensters hat keine Auswirkungen auf den Sichtbarkeitszustand der untergeordneten Fenster; d. h., die untergeordneten Fenster werden zusammen mit dem übergeordneten Fenster minimiert, aber die WS_VISIBLE Formatvorlage wird nicht geändert.
Selbst wenn ein Fenster die WS_VISIBLE Formatvorlage aufweist, kann der Benutzer das Fenster möglicherweise nicht auf dem Bildschirm sehen; Andere Fenster überschneiden sich möglicherweise vollständig oder wurden über den Bildschirmrand hinaus verschoben. Außerdem unterliegt ein sichtbares untergeordnetes Fenster den Beschneidungsregeln, die durch die Beziehung zwischen übergeordneten und untergeordneten Elementen festgelegt wurden. Wenn das übergeordnete Fenster des Fensters nicht sichtbar ist, ist es auch nicht sichtbar. Wenn das übergeordnete Fenster über den Rand des Bildschirms hinaus bewegt wird, wird das untergeordnete Fenster auch verschoben, da ein untergeordnetes Fenster relativ zur oberen linken Ecke des übergeordneten Elements gezeichnet wird. Beispielsweise kann ein Benutzer das übergeordnete Fenster, das das untergeordnete Fenster enthält, weit genug vom Rand des Bildschirms verschieben, den der Benutzer möglicherweise nicht sehen kann, obwohl das untergeordnete Fenster und das übergeordnete Fenster die WS_VISIBLE Formatvorlage aufweisen.
Minimierte, maximierte und wiederhergestellte Fenster
Ein maximiertes Fenster ist ein Fenster mit WS_MAXIMIZE Formatvorlage. Standardmäßig vergrößert das System ein maximiertes Fenster, sodass es den Bildschirm ausfüllt oder im Fall eines untergeordneten Fensters den Clientbereich des übergeordneten Fensters ausfüllt. Obwohl die Größe eines Fensters auf dieselbe Größe eines maximierten Fensters festgelegt werden kann, unterscheidet sich ein maximiertes Fenster geringfügig. Das System verschiebt die Titelleiste des Fensters automatisch an den oberen Rand des Bildschirms oder zum oberen Rand des Clientbereichs des übergeordneten Fensters. Außerdem deaktiviert das System den Größenrahmen des Fensters und die Fensterpositionierungsfunktion der Titelleiste (sodass der Benutzer das Fenster nicht durch Ziehen der Titelleiste verschieben kann).
Ein minimiertes Fenster ist ein Fenster mit WS_MINIMIZE Formatvorlage. Standardmäßig reduziert das System ein minimiertes Fenster auf die Größe der Taskleistenschaltfläche und verschiebt das minimierte Fenster auf die Taskleiste. Ein wiederhergestelltes Fenster ist ein Fenster, das an seine vorherige Größe und Position zurückgegeben wurde, d. h. die Größe, die es vor dem Minimieren oder Maximieren war.
Wenn eine Anwendung die WS_MAXIMIZE oder WS_MINIMIZE Formatvorlage in der CreateWindowEx--Funktion angibt, wird das Fenster anfangs maximiert oder minimiert. Nach dem Erstellen eines Fensters kann eine Anwendung die CloseWindow--Funktion verwenden, um das Fenster zu minimieren. Die ArrangeIconicWindows Funktion ordnet die Symbole auf dem Desktop an oder ordnet die minimierten untergeordneten Fenster eines übergeordneten Fensters im übergeordneten Fenster an. Die OpenIcon-Funktion stellt ein minimiertes Fenster auf die vorherige Größe und Position wieder her.
Die ShowWindow--Funktion kann ein Fenster minimieren, maximieren oder wiederherstellen. Sie kann auch die Sichtbarkeits- und Aktivierungszustände des Fensters festlegen. Die SetWindowPlacement--Funktion enthält die gleiche Funktionalität wie ShowWindow-, aber sie kann die standardmäßig minimierte, maximierte und wiederhergestellte Position des Fensters außer Kraft setzen.
Die funktionen IsZoomed und IsIconic bestimmen, ob ein bestimmtes Fenster maximiert bzw. minimiert ist. Die GetWindowPlacement--Funktion ruft die minimierten, maximierten und wiederhergestellten Positionen für das Fenster ab und bestimmt außerdem den Anzeigezustand des Fensters.
Wenn das System einen Befehl empfängt, um ein minimiertes Fenster zu maximieren oder wiederherzustellen, sendet es das Fenster eine WM_QUERYOPEN Nachricht. Wenn die Fensterprozedur FALSE-zurückgibt, ignoriert das System den Maximierungs- oder Wiederherstellungsbefehl.
Das System legt automatisch die Größe und Position eines maximierten Fensters auf die systemdefinierten Standardwerte für ein maximiertes Fenster fest. Um diese Standardwerte außer Kraft zu setzen, kann eine Anwendung entweder die SetWindowPlacement--Funktion aufrufen oder die WM_GETMINMAXINFO Nachricht verarbeiten, die von einem Fenster empfangen wird, wenn das System das Fenster maximiert. WM_GETMINMAXINFO enthält einen Zeiger auf eine MINMAXINFO- Struktur mit Werten, die das System zum Festlegen der maximierten Größe und Position verwendet. Durch das Ersetzen dieser Werte werden die Standardwerte außer Kraft gesetzt.
Fenstergröße und -position
Die Größe und Position eines Fensters werden als umgebendes Rechteck ausgedrückt, das in Koordinaten relativ zum Bildschirm oder zum übergeordneten Fenster angegeben wird. Die Koordinaten eines Fensters der obersten Ebene sind relativ zur oberen linken Bildschirmecke; die Koordinaten eines untergeordneten Fensters relativ zur oberen linken Ecke des übergeordneten Fensters sind. Eine Anwendung gibt die anfängliche Größe und Position eines Fensters an, wenn es das Fenster erstellt, aber es kann jederzeit die Größe und Position des Fensters ändern. Weitere Informationen finden Sie unter Gefüllte Shapes.
Dieser Abschnitt enthält die folgenden Themen:
- Standardgröße und -position
- Nachverfolgungsgröße
- Systembefehle
- Funktionen für Größe und Position
- Größe und Position von Nachrichten
Standardgröße und -position
Eine Anwendung kann es dem System ermöglichen, die Anfangsgröße oder Position eines Fensters auf oberster Ebene zu berechnen, indem CW_USEDEFAULT in CreateWindowEx-angegeben wird. Wenn die Anwendung die Koordinaten des Fensters auf CW_USEDEFAULT festlegt und keine anderen Fenster auf oberster Ebene erstellt hat, legt das System die Position des neuen Fensters relativ zur oberen linken Bildschirmecke fest; andernfalls wird die Position relativ zur Position des Fensters der obersten Ebene festgelegt, das die Anwendung zuletzt erstellt hat. Wenn die Parameter für Breite und Höhe auf CW_USEDEFAULT festgelegt sind, berechnet das System die Größe des neuen Fensters. Wenn die Anwendung andere Fenster der obersten Ebene erstellt hat, basiert das System auf der Größe des neuen Fensters auf der Größe des zuletzt erstellten Fensters auf oberster Ebene. Die Angabe CW_USEDEFAULT beim Erstellen eines untergeordneten oder Popupfensters bewirkt, dass das System die Größe des Fensters auf die standardmäßige Mindestfenstergröße festlegt.
Nachverfolgungsgröße
Das System behält eine minimale und maximale Nachverfolgungsgröße für ein Fenster des WS_THICKFRAME-Stils bei; Ein Fenster mit dieser Formatvorlage weist einen Rahmen für die Größenanpassung auf. Die minimale Nachverfolgungsgröße ist die kleinste Fenstergröße, die Sie erzeugen können, indem Sie den Rahmen für die Fenstergröße ziehen. Ebenso ist die maximale Nachverfolgungsgröße die größte Fenstergröße, die Sie durch Ziehen des Größenrahmens erzeugen können.
Die mindesten und maximalen Nachverfolgungsgrößen eines Fensters werden auf systemdefinierte Standardwerte festgelegt, wenn das System das Fenster erstellt. Eine Anwendung kann die Standardwerte ermitteln und überschreiben, indem sie die WM_GETMINMAXINFO Nachricht verarbeiten. Weitere Informationen finden Sie unter Größe und Position von Nachrichten.
Systembefehle
Eine Anwendung mit einem Fenstermenü kann die Größe und Position dieses Fensters ändern, indem Systembefehle gesendet werden. Systembefehle werden generiert, wenn der Benutzer Befehle aus dem Fenstermenü auswählt. Eine Anwendung kann die Benutzeraktion emulieren, indem eine WM_SYSCOMMAND Nachricht an das Fenster gesendet wird. Die folgenden Systembefehle wirken sich auf die Größe und Position eines Fensters aus.
Befehl | Beschreibung |
---|---|
SC_CLOSE | Schließt das Fenster. Dieser Befehl sendet eine WM_CLOSE Nachricht an das Fenster. Das Fenster führt alle Schritte aus, die erforderlich sind, um sich zu bereinigen und zu zerstören. |
SC_MAXIMIZE | Maximiert das Fenster. |
SC_MINIMIZE | Minimiert das Fenster. |
SC_MOVE | Verschiebt das Fenster. |
SC_RESTORE | Stellt ein minimiertes oder maximiertes Fenster auf seine vorherige Größe und Position wieder her. |
SC_SIZE | Startet einen Größenbefehl. Um die Größe des Fensters zu ändern, verwenden Sie die Maus oder Tastatur. |
Größen- und Positionsfunktionen
Nach dem Erstellen eines Fensters kann eine Anwendung die Größe oder Position des Fensters festlegen, indem eine von mehreren verschiedenen Funktionen aufgerufen wird, einschließlich SetWindowPlacement, MoveWindow, SetWindowPosund DeferWindowPos. SetWindowPlacement- legt die minimierte Position eines Fensters fest, maximierte Position, wiederhergestellte Größe und Position sowie den Anzeigezustand. Die funktionen MoveWindow und SetWindowPos sind ähnlich; beide legen die Größe oder Position eines einzelnen Anwendungsfensters fest. Die SetWindowPos--Funktion enthält eine Reihe von Flags, die sich auf den Anzeigezustand des Fensters auswirken; MoveWindow- enthält diese Flags nicht. Verwenden Sie die funktionen BeginDeferWindowPos, DeferWindowPosund EndDeferWindowPos Funktionen, um die Position einer Reihe von Fenstern gleichzeitig festzulegen, einschließlich Größe, Position, Position in der Z-Reihenfolge und Anzeigezustand.
Eine Anwendung kann die Koordinaten des umgebenden Rechtecks eines Fensters mithilfe der GetWindowRect--Funktion abrufen. GetWindowRect füllt eine RECT- Struktur mit den Koordinaten der oberen linken und unteren rechten Ecke des Fensters. Die Koordinaten sind relativ zur oberen linken Ecke des Bildschirms, auch für ein untergeordnetes Fenster. Die ScreenToClient- oder MapWindowPoints--Funktion ordnet die Bildschirmkoordinaten des umgebenden Rechtecks eines untergeordneten Fensters relativ zum Clientbereich des übergeordneten Fensters zu.
Die GetClientRect--Funktion ruft die Koordinaten des Clientbereichs eines Fensters ab. GetClientRect füllt eine RECT- Struktur mit den Koordinaten der oberen linken und unteren rechten Ecke des Clientbereichs, aber die Koordinaten sind relativ zum Clientbereich selbst. Dies bedeutet, dass die Koordinaten der oberen linken Ecke eines Clientbereichs immer (0,0) und die Koordinaten der unteren rechten Ecke die Breite und Höhe des Clientbereichs sind.
Die CascadeWindows Funktion kaskadiert die Fenster auf dem Desktop oder kaskadiert die untergeordneten Fenster des angegebenen übergeordneten Fensters. Die TileWindows Funktion kacheln die Fenster auf dem Desktop oder kacheln die untergeordneten Fenster des angegebenen übergeordneten Fensters.
Größe und Position von Nachrichten
Das System sendet die WM_GETMINMAXINFO Nachricht an ein Fenster, dessen Größe oder Position sich ändert. Die Nachricht wird z. B. gesendet, wenn der Benutzer im Fenstermenü auf Verschieben oder Größe klickt oder auf den Rahmen oder die Titelleiste klickt; die Nachricht wird auch gesendet, wenn eine Anwendung SetWindowPos aufruft, um das Fenster zu verschieben oder zu vergrößern. WM_GETMINMAXINFO enthält einen Zeiger auf eine MINMAXINFO- Struktur, die die standardmäßige maximierte Größe und Position für das Fenster sowie die standardmäßigen mindest- und maximalen Nachverfolgungsgrößen enthält. Eine Anwendung kann die Standardwerte außer Kraft setzen, indem WM_GETMINMAXINFO verarbeitet und die entsprechenden Member von MINMAXINFO-festgelegt werden. Ein Fenster muss die WS_THICKFRAME oder WS_CAPTION Formatvorlage aufweisen, um WM_GETMINMAXINFOzu empfangen. Ein Fenster mit der WS_THICKFRAME Formatvorlage empfängt diese Nachricht während des Fenstererstellungsprozesses sowie beim Verschieben oder Ändern der Größe.
Das System sendet die WM_WINDOWPOSCHANGING Nachricht an ein Fenster, dessen Größe, Position, Position in der Z-Reihenfolge oder Anzeigezustand sich ändert. Diese Meldung enthält einen Zeiger auf eine WINDOWPOS- Struktur, die die neue Größe, Position, Position in der Z-Reihenfolge und den Zustand des Fensters angibt. Durch Festlegen der Elemente von WINDOWPOS-kann eine Anwendung die neue Größe, Position und Darstellung des Fensters beeinflussen.
Nachdem Sie die Größe, Position, Position in der Z-Reihenfolge oder den Anzeigezustand eines Fensters geändert haben, sendet das System die WM_WINDOWPOSCHANGED Nachricht an das Fenster. Diese Meldung enthält einen Zeiger auf WINDOWPOS-, der das Fenster über seine neue Größe, Position, Position in der Z-Reihenfolge und den Anzeigezustand informiert. Das Festlegen der Elemente der WINDOWPOS- Struktur, die mit WM_WINDOWPOSCHANGED übergeben wird, hat keine Auswirkung auf das Fenster. Ein Fenster, das WM_SIZE verarbeiten muss, und WM_MOVE Nachrichten müssen WM_WINDOWPOSCHANGED an die DefWindowProc--Funktion übergeben; andernfalls sendet das System keine WM_SIZE und WM_MOVE Nachrichten an das Fenster.
Das System sendet die WM_NCCALCSIZE Nachricht an ein Fenster, wenn das Fenster erstellt oder angepasst wird. Das System verwendet die Meldung, um die Größe des Clientbereichs eines Fensters und die Position des Clientbereichs relativ zur oberen linken Ecke des Fensters zu berechnen. In einem Fenster wird diese Meldung in der Regel an die Standardfensterprozedur übergeben. Diese Meldung kann jedoch in Anwendungen hilfreich sein, die den Nichtclientbereich eines Fensters anpassen oder Teile des Clientbereichs beibehalten, wenn das Fenster angepasst wird. Weitere Informationen finden Sie unter Mal- und Zeichnungs-.
Fensteranimation
Mithilfe der AnimateWindow-Funktion können Sie Spezialeffekte erzeugen, wenn Sie Fenster ein- oder ausblenden. Wenn das Fenster auf diese Weise animiert wird, wird das System abhängig von den Flags, die Sie in einem Aufruf von AnimateWindowangeben, entweder rollen, ziehen oder ausblenden.
Standardmäßig verwendet das System Rollanimation. Mit diesem Effekt wird das Fenster eingeblendet (mit dem Fenster) oder roll geschlossen (ausblenden des Fensters). Mit dem parameter dwFlags können Sie angeben, ob das Fenster horizontal, vertikal oder diagonal rollt.
Wenn Sie das AW_SLIDE-Kennzeichen angeben, verwendet das System Folienanimation. Mit diesem Effekt wird das Fenster eingeblendet (mit dem Fenster) oder außerhalb der Ansicht (ausblenden des Fensters) angezeigt. Mit dem dwFlags Parameter können Sie angeben, ob das Fenster horizontal, vertikal oder diagonal geschoben wird.
Wenn Sie das AW_BLEND-Flag angeben, verwendet das System eine alpha-blended faden.
Sie können auch die AW_CENTER-Kennzeichnung verwenden, um ein Fenster nach innen zu reduzieren oder nach außen zu erweitern.
Fensterlayout und Spiegelung
Das Fensterlayout definiert, wie Text- und GDI-Objekte (Windows Graphics Device Interface) in einem Fenster- oder Gerätekontext (DC) angeordnet werden. Für einige Sprachen wie Englisch, Französisch und Deutsch ist ein Links-nach-rechts-Layout (LTR) erforderlich. Andere Sprachen, z. B. Arabisch und Hebräisch, erfordern das Layout von rechts nach links (RTL). Das Fensterlayout gilt für Text, wirkt sich aber auch auf die anderen GDI-Elemente des Fensters aus, darunter Bitmaps, Symbole, die Position des Ursprungs, Schaltflächen, Kaskadierende Struktursteuerelemente und ob die horizontale Koordinate bei links oder rechts zunimmt. Nachdem eine Anwendung beispielsweise das RTL-Layout festgelegt hat, wird der Ursprung am rechten Rand des Fensters oder Geräts positioniert, und die Zahl, die die horizontale Koordinate darstellt, steigt, während Sie nach links bewegen. Allerdings sind nicht alle Objekte vom Layout eines Fensters betroffen. Beispielsweise muss das Layout für Dialogfelder, Meldungsfelder und Gerätekontexte, die keinem Fenster zugeordnet sind, z. B. Metadateien und Drucker-DCs, separat behandelt werden. Einzelheiten zu diesen Themen werden weiter unten in diesem Thema erwähnt.
Mit den Fensterfunktionen können Sie das Fensterlayout in arabischen und hebräischen Versionen von Windows angeben oder ändern. Beachten Sie, dass das Wechseln zu einem RTL-Layout (auch als Spiegelung bezeichnet) für Fenster mit CS_OWNDC oder für einen DC mit dem grafikmodus GM_ADVANCED nicht unterstützt wird.
Standardmäßig ist das Fensterlayout von links nach rechts (LTR) festgelegt. Rufen Sie zum Festlegen des RTL-Fensterlayouts CreateWindowEx- mit der Formatvorlage WS_EX_LAYOUTRTLauf. Standardmäßig verfügt ein untergeordnetes Fenster (d. h. ein fenster, das mit dem WS_CHILD-Format erstellt wurde und mit einem gültigen übergeordneten hWnd Parameter im Aufruf von CreateWindow oder CreateWindowEx) dasselbe Layout wie das übergeordnete Element aufweist. Um die Vererbung der Spiegelung an alle untergeordneten Fenster zu deaktivieren, geben Sie WS_EX_NOINHERITLAYOUT im Aufruf von CreateWindowEx-an. Beachten Sie, dass die Spiegelung nicht von fenstereigenen Fenstern geerbt wird (die ohne die WS_CHILD Formatvorlage erstellt wurden) oder die mit dem übergeordneten hWnd Parameter in CreateWindowEx auf NULL-festgelegt sind. Um die Vererbung der Spiegelung für ein einzelnes Fenster zu deaktivieren, verarbeiten Sie die WM_NCCREATE Nachricht mit GetWindowLong- und SetWindowLong-, um das WS_EX_LAYOUTRTL Flag zu deaktivieren. Diese Verarbeitung ist zusätzlich zu allen anderen Verarbeitungsvorgängen erforderlich. Das folgende Codefragment zeigt, wie dies erfolgt.
SetWindowLong (hWnd,
GWL_EXSTYLE,
GetWindowLong(hWnd,GWL_EXSTYLE) & ~WS_EX_LAYOUTRTL))
Sie können das Standardlayout auf "RTL" festlegen, indem Sie SetProcessDefaultLayout-(LAYOUT_RTL) aufrufen. Alle Fenster, die nach dem Aufruf erstellt wurden, werden gespiegelt, vorhandene Fenster sind jedoch nicht betroffen. Rufen Sie SetProcessDefaultLayout(0) auf, um die Standardspiegelung zu deaktivieren.
Beachten Sie, SetProcessDefaultLayout die DCs nur von gespiegelten Fenstern spiegeln. Rufen Sie SetLayout-(hdc, LAYOUT_RTL) auf, um einen beliebigen DC-Computer zu spiegeln. Weitere Informationen finden Sie in der Diskussion zu Spiegelungsgerätekontexten, die nicht mit Fenstern verknüpft sind. Dies wird später in diesem Thema erläutert.
Bitmaps und Symbole in einem gespiegelten Fenster werden ebenfalls standardmäßig gespiegelt. Diese sollten jedoch nicht alle gespiegelt werden. Beispielsweise sollten solche mit Text, einem Geschäftslogo oder einer analogen Uhr nicht gespiegelt werden. Um die Spiegelung von Bitmaps zu deaktivieren, rufen Sie SetLayout- mit dem bitsatz LAYOUT_BITMAPORIENTATIONPRESERVED in dwLayout-auf. Um die Spiegelung in einem DC zu deaktivieren, rufen Sie SetLayout(hdc, 0) auf.
Rufen Sie zum Abfragen des aktuellen Standardlayouts GetProcessDefaultLayoutauf. Bei erfolgreicher Rückgabe enthält pdwDefaultLayout LAYOUT_RTL oder 0. Rufen Sie GetLayoutauf, um die Layouteinstellungen des Gerätekontexts abzufragen. Bei erfolgreicher Rückgabe gibt GetLayout einen DWORD- zurück, der die Layouteinstellungen durch die Einstellungen der LAYOUT_RTL und der LAYOUT_BITMAPORIENTATIONPRESERVED Bits angibt.
Nachdem ein Fenster erstellt wurde, ändern Sie das Layout mithilfe der funktion SetWindowLong. Dies ist beispielsweise erforderlich, wenn der Benutzer die Benutzeroberflächensprache eines vorhandenen Fensters von Arabisch oder Hebräisch in Deutsch ändert. Wenn Sie jedoch das Layout eines vorhandenen Fensters ändern, müssen Sie das Fenster ungültig machen und aktualisieren, um sicherzustellen, dass der Inhalt des Fensters alle auf demselben Layout gezeichnet wird. Das folgende Codebeispiel stammt aus beispielcode, der das Fensterlayout nach Bedarf ändert:
// Using ANSI versions of GetWindowLong and SetWindowLong because Unicode
// is not needed for these calls
lExStyles = GetWindowLongA(hWnd, GWL_EXSTYLE);
// Check whether new layout is opposite the current layout
if (!!(pLState -> IsRTLLayout) != !!(lExStyles & WS_EX_LAYOUTRTL))
{
// the following lines will update the window layout
lExStyles ^= WS_EX_LAYOUTRTL; // toggle layout
SetWindowLongA(hWnd, GWL_EXSTYLE, lExStyles);
InvalidateRect(hWnd, NULL, TRUE); // to update layout in the client area
}
Bei der Spiegelung sollten Sie in Bezug auf "near" und "far" anstelle von "left" und "right" denken. Dies kann zu Problemen führen. Eine gängige Codierungspraxis, die Probleme in einem gespiegelten Fenster verursacht, wenn die Zuordnung zwischen Bildschirmkoordinaten und Clientkoordinaten erfolgt. Anwendungen verwenden z. B. häufig Code ähnlich dem folgenden, um ein Steuerelement in einem Fenster zu positionieren:
// DO NOT USE THIS IF APPLICATION MIRRORS THE WINDOW
// get coordinates of the window in screen coordinates
GetWindowRect(hControl, (LPRECT) &rControlRect);
// map screen coordinates to client coordinates in dialog
ScreenToClient(hDialog, (LPPOINT) &rControlRect.left);
ScreenToClient(hDialog, (LPPOINT) &rControlRect.right);
Dies führt zu Problemen bei der Spiegelung, da der linke Rand des Rechtecks in einem gespiegelten Fenster zum rechten Rand wird und umgekehrt. Um dieses Problem zu vermeiden, ersetzen Sie die ScreenToClient-Aufrufe durch einen Aufruf von MapWindowPoints wie folgt:
// USE THIS FOR MIRRORING
GetWindowRect(hControl, (LPRECT) &rControlRect);
MapWindowPoints(NULL, hDialog, (LPPOINT) &rControlRect, 2)
Dieser Code funktioniert, da auf Plattformen, die die Spiegelung unterstützen, MapWindowPoints geändert wird, um die Linken und rechten Punktkoordinaten zu tauschen, wenn das Clientfenster gespiegelt wird. Weitere Informationen finden Sie im Abschnitt "Hinweise" von MapWindowPoints.
Eine weitere gängige Methode, die Probleme in gespiegelten Fenstern verursachen kann, ist das Positionieren von Objekten in einem Clientfenster mithilfe von Offsets in Bildschirmkoordinaten anstelle von Clientkoordinaten. Der folgende Code verwendet beispielsweise den Unterschied in Bildschirmkoordinaten als x-Position in Clientkoordinaten, um ein Steuerelement in einem Dialogfeld zu positionieren.
// OK if LTR layout and mapping mode of client is MM_TEXT,
// but WRONG for a mirrored dialog
RECT rdDialog;
RECT rcControl;
HWND hControl = GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hDlg, &rcDialog); // gets rect in screen coordinates
GetWindowRect(hControl, &rcControl);
MoveWindow(hControl,
rcControl.left - rcDialog.left, // uses x position in client coords
rcControl.top - rcDialog.top,
nWidth,
nHeight,
FALSE);
Dieser Code ist in Ordnung, wenn das Dialogfeld das Layout von links nach rechts (LTR) aufweist und der Zuordnungsmodus des Clients MM_TEXT ist, da die neue x-Position in Clientkoordinaten dem Unterschied in linken Rändern des Steuerelements und des Dialogfelds in Bildschirmkoordinaten entspricht. In einem gespiegelten Dialogfeld werden links und rechts jedoch umgekehrt. Stattdessen sollten Sie MapWindowPoints wie folgt verwenden:
RECT rcDialog;
RECT rcControl;
HWND hControl - GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hControl, &rcControl);
// MapWindowPoints works correctly in both mirrored and non-mirrored windows.
MapWindowPoints(NULL, hDlg, (LPPOINT) &rcControl, 2);
// Now rcControl is in client coordinates.
MoveWindow(hControl, rcControl.left, rcControl.top, nWidth, nHeight, FALSE)
Spiegelung von Dialogfeldern und Meldungsfeldern
Dialogfelder und Meldungsfelder erben kein Layout, daher müssen Sie das Layout explizit festlegen. Um ein Meldungsfeld zu spiegeln, rufen Sie MessageBox- oder MessageBoxEx- mit der Option MB_RTLREADING auf. Um ein Dialogfeld von rechts nach links zu layouten, verwenden Sie die erweiterte Formatvorlage WS_EX_LAYOUTRTL in der Dialogfeldvorlagenstruktur DLGTEMPLATEEX-. Eigenschaftenblätter sind ein Sonderfall von Dialogfeldern. Jede Registerkarte wird als separates Dialogfeld behandelt, daher müssen Sie die WS_EX_LAYOUTRTL Formatvorlage in jede Registerkarte einschließen, die gespiegelt werden soll.
Spiegelung von Gerätekontexten, die keinem Fenster zugeordnet sind
DCs, die keinem Fenster zugeordnet sind, z. B. Metadatei oder Drucker-DCs, erben kein Layout, daher müssen Sie das Layout explizit festlegen. Verwenden Sie zum Ändern des Gerätekontextlayouts die SetLayout--Funktion.
Die SetLayout--Funktion wird selten mit Fenstern verwendet. In der Regel empfangen Fenster einen zugeordneten DC nur bei der Verarbeitung einer WM_PAINT Nachricht. Gelegentlich erstellt ein Programm einen DC für ein Fenster, indem GetDC-aufgerufen wird. Auf beide Weise wird das anfängliche Layout für den DC durch BeginPaint- oder GetDC- entsprechend dem WS_EX_LAYOUTRTL Flag des Fensters festgelegt.
Die von GetWindowOrgEx, GetWindowExtEx, GetViewportOrgEx und GetViewportExtEx werden nicht von aufrufen SetLayoutbeeinflusst.
Wenn das Layout RTL ist, gibt GetMapMode- anstelle von MM_TEXT MM_ANISOTROPIC zurück. Das Aufrufen von SetMapMode- mit MM_TEXT funktioniert ordnungsgemäß; Nur der Rückgabewert von GetMapMode- ist betroffen. Ebenso bewirkt das Aufrufen SetLayout-(hdc, LAYOUT_RTL), wenn der Zuordnungsmodus MM_TEXT bewirkt, dass sich der gemeldete Zuordnungsmodus in MM_ANISOTROPIC ändert.
Fenstervernichtung
Im Allgemeinen muss eine Anwendung alle von ihr erzeugten Fenster zerstören. Dazu wird die funktion DestroyWindow verwendet. Wenn ein Fenster zerstört wird, blendet das System das Fenster aus, wenn es sichtbar ist, und entfernt dann alle internen Daten, die dem Fenster zugeordnet sind. Dadurch wird das Fensterhandle ungültig, das von der Anwendung nicht mehr verwendet werden kann.
Eine Anwendung zerstört viele der Fenster, die sie bald nach der Erstellung erstellt. Beispielsweise zerstört eine Anwendung in der Regel ein Dialogfeldfenster, sobald die Anwendung über ausreichende Eingaben des Benutzers verfügt, um die Aufgabe fortzusetzen. Eine Anwendung zerstört schließlich das Hauptfenster der Anwendung (vor dem Beenden).
Vor dem Löschen eines Fensters sollte eine Anwendung alle dem Fenster zugeordneten Daten speichern oder entfernen und alle systembezogenen Ressourcen für das Fenster freigeben. Wenn die Anwendung die Ressourcen nicht freigibt, gibt das System keine Ressourcen frei, die von der Anwendung nicht freigegeben werden.
Das Löschen eines Fensters wirkt sich nicht auf die Fensterklasse aus, aus der das Fenster erstellt wird. Neue Fenster können weiterhin mithilfe dieser Klasse erstellt werden, und alle vorhandenen Fenster dieser Klasse funktionieren weiterhin. Durch das Zerstören eines Fensters werden auch die untergeordneten Fenster des Fensters zerstört. Die DestroyWindow-Funktion sendet zuerst eine WM_DESTROY Nachricht an das Fenster, dann an die untergeordneten Fenster und untergeordneten Fenster. Auf diese Weise werden auch alle untergeordneten Fenster des zerstörten Fensters zerstört.
Ein Fenster mit einem Fenstermenü empfängt eine WM_CLOSE Nachricht, wenn der Benutzer auf Schließenklickt. Durch die Verarbeitung dieser Nachricht kann eine Anwendung den Benutzer zur Bestätigung auffordern, bevor es das Fenster zerstört. Wenn der Benutzer bestätigt, dass das Fenster zerstört werden soll, kann die Anwendung die DestroyWindow-Funktion aufrufen, um das Fenster zu zerstören.
Wenn das zu zerstörende Fenster das aktive Fenster ist, werden sowohl der aktive als auch der Fokusstatus in ein anderes Fenster übertragen. Das Fenster, das zum aktiven Fenster wird, ist das nächste Fenster, wie durch die TASTENkombination ALT+ESC bestimmt. Das neue aktive Fenster bestimmt dann, welches Fenster den Tastaturfokus erhält.