Freigeben über


Informationen zu Fensterklassen

Jede Fensterklasse verfügt über eine zugeordnete Fensterprozedur, die von allen Fenstern derselben Klasse gemeinsam verwendet wird. Die Fensterprozedur verarbeitet Meldungen für alle Fenster dieser Klasse und steuert daher ihr Verhalten und aussehen. Weitere Informationen finden Sie unter Window Procedures.

Ein Prozess muss eine Fensterklasse registrieren, bevor ein Fenster dieser Klasse erstellt werden kann. Durch das Registrieren einer Fensterklasse wird eine Fensterprozedur, Klassenformatvorlagen und andere Klassenattribute einem Klassennamen zugeordnet. Wenn ein Prozess einen Klassennamen in der CreateWindow oder CreateWindowEx--Funktion angibt, erstellt das System ein Fenster mit der Fensterprozedur, Formatvorlagen und anderen Attributen, die diesem Klassennamen zugeordnet sind.

In diesem Abschnitt werden die folgenden Themen erläutert.

Typen von Fensterklassen

Es gibt drei Arten von Fensterklassen:

Diese Typen unterscheiden sich in umfangs- und wann und wie sie registriert und zerstört werden.

Systemklassen

Eine Systemklasse ist eine vom System registrierte Fensterklasse. Viele Systemklassen sind für alle zu verwendenden Prozesse verfügbar, während andere nur intern vom System verwendet werden. Da das System diese Klassen registriert, kann ein Prozess sie nicht zerstören.

Das System registriert die Systemklassen für einen Prozess, wenn eines seiner Threads zum ersten Mal eine User- oder eine GDI-Funktion (Windows Graphics Device Interface) aufruft.

Jede Anwendung erhält eine eigene Kopie der Systemklassen. Alle 16-Bit-Windows-basierten Anwendungen in derselben VDM teilen Systemklassen, genau wie bei 16-Bit-Windows.

In der folgenden Tabelle werden die Systemklassen beschrieben, die für die Verwendung durch alle Prozesse verfügbar sind.

Klasse Beschreibung
Knopf Die Klasse für eine Schaltfläche.
ComboBox Die Klasse für ein Kombinationsfeld.
Redigieren Die Klasse für ein Bearbeitungssteuerelement.
ListBox Die Klasse für ein Listenfeld.
MDIClient Die Klasse für ein MDI-Clientfenster.
ScrollBar Die Klasse für eine Bildlaufleiste.
Statisch Die Klasse für ein statisches Steuerelement.

 

In der folgenden Tabelle werden die Systemklassen beschrieben, die nur für die Verwendung durch das System verfügbar sind. Sie werden hier zur Vollständigkeit aufgeführt.

Klasse Beschreibung
ComboLBox Die Klasse für das Listenfeld, das in einem Kombinationsfeld enthalten ist.
DDEMLEvent Die Klasse für DDEML-Ereignisse (Dynamic Data Exchange Management Library).
Nachricht Die Klasse für ein Nur-Nachrichten-Fenster.
#32768 Die Klasse für ein Menü.
#32769 Die Klasse für das Desktopfenster.
#32770 Die Klasse für ein Dialogfeld.
#32771 Die Klasse für das Aufgabenwechselfenster.
#32772 Die Klasse für Symboltitel.

 

Globale Anwendungsklassen

Eine globalen Anwendungsklasse ist eine Fensterklasse, die von einer ausführbaren Datei oder DLL registriert ist, die für alle anderen Module im Prozess verfügbar ist. Beispielsweise kann Ihre .dll die RegisterClassEx--Funktion aufrufen, um eine Fensterklasse zu registrieren, die ein benutzerdefiniertes Steuerelement als globale Anwendungsklasse definiert, sodass ein Prozess, der die .dll lädt, Instanzen des benutzerdefinierten Steuerelements erstellen kann.

Um eine Klasse zu erstellen, die in jedem Prozess verwendet werden kann, erstellen Sie die Fensterklasse in einem .dll, und laden Sie die .dll in jedem Prozess. Um die .dll in jedem Prozess zu laden, fügen Sie den Namen zum AppInit_DLLs Wert im folgenden Registrierungsschlüssel hinzu:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows

Wenn ein Prozess beginnt, lädt das System die angegebene .dll im Kontext des neu gestarteten Prozesses, bevor die Einstiegspunktfunktion aufgerufen wird. Die .dll müssen die Klasse während der Initialisierungsprozedur registrieren und die CS_GLOBALCLASS Formatvorlage angeben. Weitere Informationen finden Sie unter Klassenformatvorlagen.

Um eine globale Anwendungsklasse zu entfernen und den damit verbundenen Speicher frei zu geben, verwenden Sie die funktion UnregisterClass.

Lokale Anwendungsklassen

Eine lokalen Anwendungsklasse ist jede Fensterklasse, die eine ausführbare Datei oder .dll für die exklusive Verwendung registriert. Obwohl Sie eine beliebige Anzahl lokaler Klassen registrieren können, ist es typisch, nur eine zu registrieren. Diese Fensterklasse unterstützt die Fensterprozedur des Hauptfensters der Anwendung.

Das System zerstört eine lokale Klasse, wenn das Modul, das es registriert hat, geschlossen wird. Eine Anwendung kann auch die funktion UnregisterClass verwenden, um eine lokale Klasse zu entfernen und den damit verbundenen Speicher frei zu geben.

So sucht das System eine Fensterklasse

Das System verwaltet eine Liste der Strukturen für jeden der drei Fensterklassentypen. Wenn eine Anwendung die CreateWindow oder CreateWindowEx--Funktion aufruft, um ein Fenster mit einer angegebenen Klasse zu erstellen, verwendet das System die folgende Prozedur, um die Klasse zu suchen.

  1. Durchsuchen Sie die Liste der lokalen Anwendungsklassen nach einer Klasse mit dem angegebenen Namen, deren Instanzhandle mit dem Instanzhandle des Moduls übereinstimmt. (Mehrere Module können denselben Namen verwenden, um lokale Klassen im selben Prozess zu registrieren.)
  2. Wenn sich der Name nicht in der lokalen Klassenliste der Anwendung befindet, durchsuchen Sie die Liste der globalen Anwendungsklassen.
  3. Wenn sich der Name nicht in der globalen Klassenliste der Anwendung befindet, durchsuchen Sie die Liste der Systemklassen.

Alle von der Anwendung erstellten Fenster verwenden dieses Verfahren, einschließlich fenstern, die vom System im Namen der Anwendung erstellt wurden, z. B. Dialogfelder. Es ist möglich, Systemklassen ohne Auswirkungen auf andere Anwendungen außer Kraft zu setzen. Das heißt, eine Anwendung kann eine lokale Anwendungsklasse mit demselben Namen wie eine Systemklasse registrieren. Dadurch wird die Systemklasse im Kontext der Anwendung ersetzt, andere Anwendungen werden jedoch nicht daran gehindert, die Systemklasse zu verwenden.

Registrieren einer Window-Klasse

Eine Fensterklasse definiert die Attribute eines Fensters, z. B. die Formatvorlage, das Symbol, den Cursor, das Menü und die Fensterprozedur. Der erste Schritt beim Registrieren einer Fensterklasse besteht darin, eine WNDCLASSEX- Struktur mit den Informationen zur Fensterklasse auszufüllen. Weitere Informationen finden Sie unter Elemente einer Window-Klasse. Übergeben Sie als Nächstes die Struktur an die RegisterClassEx--Funktion. Weitere Informationen finden Sie unter Verwenden von Fensterklassen.

Um eine globale Anwendungsklasse zu registrieren, geben Sie die CS_GLOBALCLASS Formatvorlage im Format Member der WNDCLASSEX--Struktur an. Geben Sie beim Registrieren einer lokalen Anwendungsklasse nicht die CS_GLOBALCLASS Formatvorlage an.

Wenn Sie die Fensterklasse mithilfe der ANSI-Version von RegisterClassEx, RegisterClassExAregistrieren, fordert die Anwendung an, dass das System Textparameter von Nachrichten an die Fenster der erstellten Klasse über den ANSI-Zeichensatz übergeben; Wenn Sie die Klasse mit der Unicode-Version von RegisterClassEx, RegisterClassExWregistrieren, fordert die Anwendung an, dass das System Textparameter von Nachrichten an die Fenster der erstellten Klasse über den Unicode-Zeichensatz übergibt. Mit der IsWindowUnicode--Funktion können Anwendungen die Art der einzelnen Fenster abfragen. Weitere Informationen zu ANSI- und Unicode-Funktionen finden Sie unter Konventionen für Funktionsprototypen.

Die ausführbare Datei oder DLL, die die Klasse registriert hat, ist der Besitzer der Klasse. Das System bestimmt den Klassenbesitz vom hInstance Member der WNDCLASSEX- Struktur, die an die RegisterClassEx--Funktion übergeben wird, wenn die Klasse registriert wird. Bei DLLs muss das hInstance Member das Handle für die .dll-Instanz sein.

Die Klasse wird nicht zerstört, wenn die .dll, die sie besitzt, entladen wird. Wenn das System die Fensterprozedur für ein Fenster dieser Klasse aufruft, führt es daher zu einer Zugriffsverletzung, da die .dll, die die Fensterprozedur enthält, nicht mehr im Arbeitsspeicher enthalten ist. Der Prozess muss alle Fenster zerstören, die die Klasse verwenden, bevor die .dll entladen wird, und die funktion UnregisterClass aufrufen.

Elemente einer Window-Klasse

Die Elemente einer Fensterklasse definieren das Standardverhalten von Fenstern, die zur Klasse gehören. Die Anwendung, die eine Fensterklasse registriert, weist der Klasse Elemente zu, indem geeignete Member in einer WNDCLASSEX--Struktur festgelegt und die Struktur an die RegisterClassEx--Funktion übergeben wird. Die funktionen GetClassInfoEx und GetClassLong abrufen Informationen zu einer bestimmten Fensterklasse. Die SetClassLong Funktion ändert Elemente einer lokalen oder globalen Klasse, die die Anwendung bereits registriert hat.

Obwohl eine vollständige Fensterklasse aus vielen Elementen besteht, erfordert das System nur, dass eine Anwendung einen Klassennamen, die Fensterprozeduradresse und ein Instanzhandle angibt. Verwenden Sie die anderen Elemente, um Standardattribute für Fenster der Klasse zu definieren, z. B. die Form des Cursors und den Inhalt des Menüs für das Fenster. Sie müssen alle nicht verwendeten Member der WNDCLASSEX- Struktur auf Null oder NULL-initialisieren. Die Fensterklassenelemente sind wie in der folgenden Tabelle dargestellt.

Element Zweck
Klassenname Unterscheidet die Klasse von anderen registrierten Klassen.
Fensterprozeduradresse Zeiger auf die Funktion, die alle nachrichten verarbeitet, die an Fenster in der Klasse gesendet werden, und definiert das Verhalten des Fensters.
Instanzhandle Identifiziert die Anwendung oder .dll, die die Klasse registriert hat.
Klassencursor- Definiert den Mauszeiger, den das System für ein Fenster der Klasse anzeigt.
Klassensymbole Definiert das große Symbol und das kleine Symbol.
Class Background Brush Definiert die Farbe und das Muster, die den Clientbereich ausfüllen, wenn das Fenster geöffnet oder gezeichnet wird.
Gibt das Standardmenü für Fenster an, die kein Menü explizit definieren.
Klassenformatvorlagen Definiert, wie das Fenster nach dem Verschieben oder Ändern der Größe aktualisiert wird, wie Doppelklicks der Maus verarbeitet werden, wie Platz für den Gerätekontext und andere Aspekte des Fensters zugewiesen werden.
zusätzlichen Klassenspeicher Gibt die Menge an zusätzlichem Arbeitsspeicher in Bytes an, die das System für die Klasse reservieren soll. Alle Fenster in der Klasse teilen den zusätzlichen Arbeitsspeicher und können ihn für jeden anwendungsdefinierten Zweck verwenden. Das System initialisiert diesen Speicher auf Null.
zusätzlichen Fensterspeicher Gibt die Menge an zusätzlichem Arbeitsspeicher in Bytes an, die das System für jedes Fenster reservieren soll, das zur Klasse gehört. Der zusätzliche Arbeitsspeicher kann für jeden anwendungsdefinierten Zweck verwendet werden. Das System initialisiert diesen Speicher auf Null.

 

Klassenname

Jede Fensterklasse benötigt einen Klassennamen, um eine Klasse von einer anderen zu unterscheiden. Weisen Sie einen Klassennamen zu, indem Sie den lpszClassName Member der WNDCLASSEX- Struktur auf die Adresse einer null-beendeten Zeichenfolge festlegen, die den Namen angibt. Da Fensterklassen prozessspezifisch sind, müssen Fensterklassennamen nur innerhalb desselben Prozesses eindeutig sein. Da Klassennamen Platz in der privaten Atomtabelle des Systems belegen, sollten Sie Klassennamenzeichenfolgen möglichst kurz halten.

Die GetClassName--Funktion ruft den Namen der Klasse ab, zu der ein bestimmtes Fenster gehört.

Fensterprozeduradresse

Jede Klasse benötigt eine Fensterprozeduradresse, um den Einstiegspunkt der Fensterprozedur zu definieren, mit der alle Nachrichten für Fenster in der Klasse verarbeitet werden. Das System übergibt Nachrichten an die Prozedur, wenn das Fenster Aufgaben ausführen muss, z. B. das Zeichnen des Clientbereichs oder das Reagieren auf Eingaben vom Benutzer. Ein Prozess weist einer Klasse eine Fensterprozedur zu, indem seine Adresse in das lpfnWndProc- Mitglied der WNDCLASSEX--Struktur kopiert wird. Weitere Informationen finden Sie unter Window Procedures.

Instanzhandle

Jede Fensterklasse erfordert ein Instanzhandle zum Identifizieren der Anwendung oder .dll, die die Klasse registriert hat. Das System erfordert Instanzhandles, um alle Module nachzuverfolgen. Das System weist jeder Kopie einer ausgeführten ausführbaren Datei oder .dllein Handle zu.

Das System übergibt ein Instanzhandle an die Einstiegspunktfunktion jeder ausführbaren Datei (siehe WinMain) und .dll (siehe DllMain-). Die ausführbare Datei oder .dll weist diese Instanz der Klasse handle zu, indem sie in das hInstance Member der WNDCLASSEX- Struktur kopiert wird.

Klassencursor

Der Klassencursor definiert die Form des Cursors, wenn er sich im Clientbereich eines Fensters in der Klasse befindet. Das System legt den Cursor automatisch auf das angegebene Shape fest, wenn der Cursor in den Clientbereich des Fensters wechselt, und stellt sicher, dass das Shape beibehalten wird, während es im Clientbereich verbleibt. Um einer Fensterklasse ein Cursor-Shape zuzuweisen, laden Sie ein vordefiniertes Cursor-Shape mithilfe der LoadCursor--Funktion, und weisen Sie dann dem hCursor Element der WNDCLASSEX- Struktur den zurückgegebenen Cursorziehpunkt zu. Stellen Sie alternativ eine benutzerdefinierte Cursorressource bereit, und verwenden Sie die LoadCursor--Funktion, um sie aus den Ressourcen der Anwendung zu laden.

Für das System ist kein Klassencursor erforderlich. Wenn eine Anwendung das hCursor Member der WNDCLASSEX- Struktur auf NULL-festlegt, wird kein Klassencursor definiert. Das System geht davon aus, dass das Fenster die Cursorform jedes Mal festlegt, wenn der Cursor in das Fenster wechselt. Ein Fenster kann das Cursor-Shape festlegen, indem die SetCursor--Funktion aufgerufen wird, sobald das Fenster die WM_MOUSEMOVE Nachricht empfängt. Weitere Informationen zu Cursorn finden Sie unter Cursor.

Klassensymbole

Ein Klassensymbol ist ein Bild, das das System verwendet, um ein Fenster einer bestimmten Klasse darzustellen. Eine Anwendung kann zwei Klassensymbole aufweisen– eine große und eine kleine. Das System zeigt das große Klassensymbol eines Fensters im Aufgabenschalterfenster an, das angezeigt wird, wenn der Benutzer ALT+TAB drückt, und in den großen Symbolansichten der Taskleiste und des Explorers. Das kleines Klassensymbol in der Titelleiste eines Fensters und in den kleinen Symbolansichten der Taskleiste und des Explorers angezeigt.

Um einer Fensterklasse ein großes und kleines Symbol zuzuweisen, geben Sie die Ziehpunkte der Symbole in der hIcon und hIconSm Member der WNDCLASSEX- Struktur an. Die Symbolabmessungen müssen den erforderlichen Dimensionen für große und kleine Klassensymbole entsprechen. Für ein großes Klassensymbol können Sie die erforderlichen Dimensionen ermitteln, indem Sie die werte SM_CXICON und SM_CYICON in einem Aufruf der GetSystemMetrics--Funktion angeben. Geben Sie für ein kleines Klassensymbol die werte SM_CXSMICON und SM_CYSMICON an. Weitere Informationen finden Sie unter Symbole.

Wenn eine Anwendung die hIcon und hIconSm-elemente der WNDCLASSEX- Struktur auf NULL-festlegt, verwendet das System das Standardanwendungssymbol als große und kleine Klassensymbole für die Fensterklasse. Wenn Sie ein großes Klassensymbol, aber nicht ein kleines Symbol angeben, erstellt das System ein kleines Klassensymbol basierend auf dem großen Symbol. Wenn Sie jedoch ein kleines Klassensymbol, aber kein großes Symbol angeben, verwendet das System das Standardanwendungssymbol als großes Klassensymbol und das angegebene Symbol als kleines Klassensymbol.

Sie können das große oder kleine Klassensymbol für ein bestimmtes Fenster überschreiben, indem Sie die WM_SETICON Nachricht verwenden. Sie können das aktuelle große oder kleine Klassensymbol mithilfe der WM_GETICON Nachricht abrufen.

Klassenhintergrundpinsel

Ein Klassenhintergrundpinsel bereitet den Clientbereich eines Fensters für die nachfolgende Zeichnung durch die Anwendung vor. Das System verwendet den Pinsel, um den Clientbereich mit einer Volltonfarbe oder einem Muster auszufüllen, wodurch alle vorherigen Bilder von dieser Position entfernt werden, unabhängig davon, ob sie zum Fenster gehören. Das System benachrichtigt ein Fenster, dass sein Hintergrund gezeichnet werden soll, indem die WM_ERASEBKGND Nachricht an das Fenster gesendet wird. Weitere Informationen finden Sie unter Brushes.

Um einer Klasse einen Hintergrundpinsel zuzuweisen, erstellen Sie einen Pinsel mithilfe der entsprechenden GDI-Funktionen, und weisen Sie dem hbrBackground Member der WNDCLASSEX- Struktur den zurückgegebenen Pinselpunkt zu.

Anstatt einen Pinsel zu erstellen, kann eine Anwendung den hbrBackground Member auf einen der Standardsystemfarbwerte festlegen. Eine Liste der Standardmäßigen Systemfarbwerte finden Sie unter SetSysColors.

Um eine Standardsystemfarbe zu verwenden, muss die Anwendung den Hintergrundfarbwert um eins erhöhen. Beispielsweise ist COLOR_BACKGROUND + 1 die Hintergrundfarbe des Systems. Alternativ können Sie die GetSysColorBrush--Funktion verwenden, um einen Handle zu einem Pinsel abzurufen, der einer Standardsystemfarbe entspricht, und dann den Handle im hbrBackground Member der WNDCLASSEX Struktur angeben.

Das System erfordert nicht, dass eine Fensterklasse über einen Klassenhintergrundpinsel verfügt. Wenn dieser Parameter auf NULL-festgelegt ist, muss das Fenster immer dann einen eigenen Hintergrund zeichnen, wenn er die WM_ERASEBKGND Nachricht empfängt.

Menü "Kurs"

Ein Klassenmenü definiert das Standardmenü, das von den Fenstern in der Klasse verwendet werden soll, wenn beim Erstellen der Fenster kein explizites Menü angegeben wird. Ein Menü ist eine Liste von Befehlen, aus denen ein Benutzer Aktionen für die Auszuführende Anwendung auswählen kann.

Sie können einer Klasse ein Menü zuweisen, indem Sie die lpszMenuName Member der WNDCLASSEX- Struktur auf die Adresse einer mit Null beendeten Zeichenfolge festlegen, die den Ressourcennamen des Menüs angibt. Das Menü wird als Ressource in der angegebenen Anwendung angenommen. Das System lädt das Menü automatisch, wenn es benötigt wird. Wenn die Menüressource durch eine ganze Zahl und nicht durch einen Namen identifiziert wird, kann die Anwendung den lpszMenuName Member auf diese ganze Zahl festlegen, indem sie das MAKEINTRESOURCE Makros anwenden, bevor Sie den Wert zuweisen.

Für das System ist kein Klassenmenü erforderlich. Wenn eine Anwendung das lpszMenuName Member der WNDCLASSEX- Struktur auf NULL-festlegt, weisen Fenster in der Klasse keine Menüleisten auf. Selbst wenn kein Klassenmenü angegeben wird, kann eine Anwendung beim Erstellen des Fensters weiterhin eine Menüleiste für ein Fenster definieren.

Wenn ein Menü für eine Klasse und ein untergeordnetes Fenster dieser Klasse angegeben wird, wird das Menü ignoriert. Weitere Informationen finden Sie unter Menüs.

Klassenformatvorlagen

Die Klassenformatvorlagen definieren zusätzliche Elemente der Fensterklasse. Zwei oder mehr Formatvorlagen können mit dem bitweisen OR (|)-Operator kombiniert werden. Um einer Fensterklasse eine Formatvorlage zuzuweisen, weisen Sie der Formatvorlage Element der WNDCLASSEX- Struktur zu. Eine Liste der Klassenformatvorlagen finden Sie unter Fensterklassenarten.

Klassen und Gerätekontexte

Ein Gerätekontext ist eine spezielle Gruppe von Werten, die Anwendungen zum Zeichnen im Clientbereich ihrer Fenster verwenden. Das System erfordert einen Gerätekontext für jedes Fenster auf dem Display, ermöglicht jedoch eine gewisse Flexibilität bei der Speicherung und Behandlung dieses Gerätekontexts.

Wenn kein Gerätekontextstil explizit angegeben wird, geht das System davon aus, dass jedes Fenster einen Gerätekontext verwendet, der aus einem Pool von Kontexten abgerufen wird, der vom System verwaltet wird. In solchen Fällen muss jedes Fenster den Gerätekontext vor dem Zeichnen abrufen und initialisieren und nach dem Zeichnen freigeben.

Um das Abrufen eines Gerätekontexts bei jedem Zeichnen in einem Fenster zu vermeiden, kann eine Anwendung die CS_OWNDC Formatvorlage für die Fensterklasse angeben. Diese Klassenart leitet das System an, einen privaten Gerätekontext zu erstellen, d. h. einen eindeutigen Gerätekontext für jedes Fenster in der Klasse zuzuweisen. Die Anwendung muss den Kontext nur einmal abrufen und dann für alle nachfolgenden Gemälde verwenden.

Zusätzlicher Klassenspeicher

Das System verwaltet eine WNDCLASSEX- Struktur intern für jede Fensterklasse im System. Wenn eine Anwendung eine Fensterklasse registriert, kann sie das System an das Ende der WNDCLASSEX- Struktur weiterleiten und eine Reihe zusätzlicher Bytes Arbeitsspeicher anfügen. Dieser Speicher wird zusätzlichen Klassenspeicher aufgerufen und wird von allen Fenstern der Klasse gemeinsam genutzt. Verwenden Sie den zusätzlichen Klassenspeicher, um alle Informationen zu speichern, die sich auf die Klasse beziehen.

Da der lokale Heap des Systems zusätzlichen Arbeitsspeicher zugewiesen wird, sollte eine Anwendung sparsam zusätzlichen Klassenspeicher verwenden. Die RegisterClassEx--Funktion schlägt fehl, wenn die angeforderte Menge an zusätzlichem Klassenspeicher größer als 40 Byte ist. Wenn eine Anwendung mehr als 40 Byte benötigt, sollte sie ihren eigenen Speicher zuweisen und einen Zeiger auf den Speicher im zusätzlichen Klassenspeicher speichern.

Die funktionen SetClassWord und SetClassLong kopieren einen Wert in den zusätzlichen Klassenspeicher. Um einen Wert aus dem zusätzlichen Klassenspeicher abzurufen, verwenden Sie die GetClassWord- und GetClassLong--Funktionen. Das cbClsExtra- Mitglied der WNDCLASSEX- Struktur gibt die Menge an zusätzlichem Klassenspeicher an, der zugewiesen werden soll. Eine Anwendung, die keinen zusätzlichen Klassenspeicher verwendet, muss das cbClsExtra Member auf Null initialisieren.

Zusätzlicher Fensterspeicher

Das System verwaltet eine interne Datenstruktur für jedes Fenster. Beim Registrieren einer Fensterklasse kann eine Anwendung eine Anzahl zusätzlicher Bytes Arbeitsspeicher angeben, die zusätzlichen Fensterspeichergenannt wird. Beim Erstellen eines Fensters der Klasse weist das System die angegebene Menge an zusätzlichen Fensterspeicher am Ende der Struktur des Fensters zu und fügt diese an. Eine Anwendung kann diesen Speicher verwenden, um fensterspezifische Daten zu speichern.

Da der lokale Heap des Systems zusätzlichen Arbeitsspeicher zugewiesen wird, sollte eine Anwendung zusätzlichen Fensterspeicher sparsam verwenden. Die RegisterClassEx--Funktion schlägt fehl, wenn die angeforderte Menge an zusätzlichem Fensterspeicher größer als 40 Bytes ist. Wenn eine Anwendung mehr als 40 Byte benötigt, sollte sie ihren eigenen Speicher zuweisen und einen Zeiger auf den Speicher im zusätzlichen Fensterspeicher speichern.

Die SetWindowLong--Funktion kopiert einen Wert in den zusätzlichen Arbeitsspeicher. Die GetWindowLong--Funktion ruft einen Wert aus dem zusätzlichen Arbeitsspeicher ab. Das cbWndExtra- Mitglied der WNDCLASSEX- Struktur gibt die Menge an zusätzlichem Fensterspeicher an, der zugeordnet werden soll. Eine Anwendung, die den Arbeitsspeicher nicht verwendet, muss cbWndExtra- auf Null initialisieren.