Was ist ein Fenster?
Was ist ein Fenster?
Fenster sind für Windows natürlich von zentraler Bedeutung. Sie sind so wichtig, dass sie das Betriebssystem nach ihnen benannt haben. Aber was ist ein Fenster? Wenn Sie sich ein Fenster vorstellen, stellen Sie sich wahrscheinlich etwas wie folgt vor:

Dieser Fenstertyp wird als Anwendungsfenster oder Hauptfenster bezeichnet. Er verfügt in der Regel über einen Rahmen mit einer Titelleiste, schaltflächen minimieren und maximieren sowie über andere Standardelemente der Benutzeroberfläche. Der Frame wird als Nicht-Clientbereich des Fensters bezeichnet, da das Betriebssystem diesen Teil des Fensters verwaltet. Der Bereich innerhalb des Rahmens ist der Clientbereich. Dies ist der Teil des Fensters, das von Ihrem Programm verwaltet wird.
Hier ist ein weiterer Fenstertyp:

Wenn Sie noch nicht mit Windows Programmierung arbeiten, ist es möglicherweise überraschend, dass Benutzeroberflächensteuerelemente wie Schaltflächen und Bearbeitungsfelder selbst Fenster sind. Der Hauptunterschied zwischen einem Benutzeroberflächensteuerelement und einem Anwendungsfenster besteht darin, dass ein Steuerelement allein nicht vorhanden ist. Stattdessen wird das Steuerelement relativ zum Anwendungsfenster positioniert. Wenn Sie das Anwendungsfenster ziehen, wird das Steuerelement wie erwartet verschoben. Außerdem können das Steuerelement und das Anwendungsfenster miteinander kommunizieren. (Das Anwendungsfenster empfängt beispielsweise Klickbenachrichtigungen von einer Schaltfläche.)
Wenn Sie also an fenster denken, denken Sie nicht einfach an das Anwendungsfenster. Stellen Sie sich stattdessen ein Fenster als Programmierkonstrukt vor, das:
- Belegt einen bestimmten Teil des Bildschirms.
- Kann zu einem bestimmten Zeitpunkt sichtbar sein oder nicht.
- Weiß, wie man sich selbst zeichnet.
- Reagiert auf Ereignisse des Benutzers oder des Betriebssystems.
Übergeordnete Windows und Besitzer-Windows
Im Fall eines Ui-Steuerelements wird das Steuerelementfenster als untergeordnetes Element des Anwendungsfensters bezeichnet. Das Anwendungsfenster ist das übergeordnete Element des Steuerelementfensters. Das übergeordnete Fenster stellt das Koordinatensystem bereit, das zum Positionieren eines untergeordneten Fensters verwendet wird. Das Verwenden eines übergeordneten Fensters wirkt sich auf Aspekte der Darstellung eines Fensters aus. Beispielsweise wird ein untergeordnetes Fenster abgeschnitten, sodass kein Teil des untergeordneten Fensters außerhalb der Rahmen des übergeordneten Fensters angezeigt werden kann.
Eine weitere Beziehung ist die Beziehung zwischen einem Anwendungsfenster und einem modalen Dialogfenster. Wenn eine Anwendung ein modales Dialogfeld anzeigt, ist das Anwendungsfenster das Besitzerfenster, und das Dialogfeld ist ein eigenes Fenster. Ein eigenes Fenster wird immer vor seinem Besitzerfenster angezeigt. Sie wird ausgeblendet, wenn der Besitzer minimiert und gleichzeitig mit dem Besitzer zerstört wird.
Die folgende Abbildung zeigt eine Anwendung, die ein Dialogfeld mit zwei Schaltflächen anzeigt:

Das Dialogfeldfenster ist im Besitz des Anwendungsfensters, und das Dialogfeldfenster ist das übergeordnete Fenster beider Schaltflächenfenster. Das folgende Diagramm zeigt diese Beziehungen:

Fensterhandles
Windows sind Objekte – sie verfügen sowohl über Code als auch über Daten –, aber sie sind keine C++-Klassen. Stattdessen verweist ein Programm mithilfe eines Werts namens handle auf ein Fenster. Ein Handle ist ein nicht transparenter Typ. Im Wesentlichen handelt es sich lediglich um eine Zahl, die das Betriebssystem verwendet, um ein Objekt zu identifizieren. Sie können sich Windows als eine große Tabelle aller erstellten Fenster ansehen. Diese Tabelle wird verwendet, um Fenster anhand ihrer Handles nachzuschlagen. (Ob genau dies intern funktioniert, ist nicht wichtig.) Der Datentyp für Fensterhandles ist HWND, was in der Regel als "aitch-wind" ausgesprochen wird. Fensterhandles werden von den Funktionen zum Erstellen von Fenstern zurückgegeben: CreateWindow und CreateWindowEx.
Um einen Vorgang in einem Fenster auszuführen, rufen Sie in der Regel eine Funktion auf, die einen HWND-Wert als Parameter annimmt. Um beispielsweise ein Fenster auf dem Bildschirm neu zu positionieren, rufen Sie die Funktion MoveWindow auf:
BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);
Der erste Parameter ist das Handle für das Fenster, das Sie verschieben möchten. Die anderen Parameter geben die neue Position des Fensters an und geben an, ob das Fenster neu gezeichnet werden soll.
Beachten Sie, dass Handles keine Zeiger sind. Wenn hwnd eine Variable ist, die ein Handle enthält, ist der Versuch, das Handle durch Schreiben zu dereferenzieren, *hwnd ein Fehler.
Bildschirm- und Fensterkoordinaten
Koordinaten werden in geräteunabhängigen Pixeln gemessen. Wir werden mehr über den geräteunabhängigen Teil von geräteunabhängigen Pixeln sagen, wenn wir Grafiken besprechen.
Je nach Aufgabe können Sie Koordinaten relativ zum Bildschirm, relativ zu einem Fenster (einschließlich des Rahmens) oder relativ zum Clientbereich eines Fensters messen. Beispielsweise würden Sie ein Fenster mit Bildschirmkoordinaten auf dem Bildschirm positionieren, aber Sie würden in einem Fenster mit Clientkoordinaten zeichnen. In jedem Fall ist der Ursprung (0, 0) immer die linke obere Ecke des Bereichs.
