Informationen zu Fensterklassen
Jede Fensterklasse verfügt über eine zugeordnete Fensterprozedur, die von allen Fenstern derselben Klasse freigegeben wird. Die Fensterprozedur verarbeitet Nachrichten für alle Fenster dieser Klasse und steuert daher deren Verhalten und Darstellung. Weitere Informationen finden Sie unter Window Procedures.
Ein Prozess muss eine Fensterklasse registrieren, bevor er ein Fenster dieser Klasse erstellen kann. Das Registrieren einer Fensterklasse verknüpft eine Fensterprozedur, Klassenstile und andere Klassenattribute mit einem Klassennamen. Wenn ein Prozess einen Klassennamen in der Funktion CreateWindow oder CreateWindowEx angibt, erstellt das System ein Fenster mit der Fensterprozedur, den Formatvorlagen und anderen Attributen, die diesem Klassennamen zugeordnet sind.
In diesem Abschnitt werden die folgenden Themen erläutert.
- Typen von Fensterklassen
- So sucht das System eine Fensterklasse
- Registrieren einer Window-Klasse
- Elemente einer Window-Klasse
Typen von Fensterklassen
Es gibt drei Arten von Fensterklassen:
Diese Typen unterscheiden sich im Bereich und in der Zeit und wie sie registriert und zerstört werden.
Systemklassen
Eine Systemklasse ist eine vom System registrierte Fensterklasse. Viele Systemklassen stehen für alle Prozesse zur Verfügung, während andere nur intern vom System verwendet werden. Da das System diese Klassen registriert, können sie von einem Prozess nicht zerstört werden.
Das System registriert die Systemklassen für einen Prozess, wenn einer seiner Threads zum ersten Mal eine User- oder windows Graphics Device Interface -Funktion (GDI) aufruft.
Jede Anwendung erhält eine eigene Kopie der Systemklassen. Alle 16-Bit-Windows-basierten Anwendungen in den gleichen VDM-Systemklassen teilen sich, genau wie bei 16-Bit-Windows.
In der folgenden Tabelle werden die Systemklassen beschrieben, die für alle Prozesse verfügbar sind.
Klasse | BESCHREIBUNG |
---|---|
Schaltfläche | Die -Klasse für eine Schaltfläche. |
Kombinationsfeld | Die -Klasse für ein Kombinationsfeld. |
Bearbeiten | 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. |
statischen | 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 sind hier der Vollständigkeit halber 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 Fenster, das nur Nachrichten enthält. |
#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 globale Anwendungsklasse ist eine Fensterklasse, die von einer ausführbaren Datei oder DLL registriert wird und für alle anderen Module im Prozess verfügbar ist. Ihr .dll kann beispielsweise 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 einer .dll, und laden Sie die .dll in jedem Prozess. Um die .dll in jedem Prozess zu laden, fügen Sie seinen Namen dem AppInit_DLLs Wert im folgenden Registrierungsschlüssel hinzu:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Fenster
Wenn ein Prozess gestartet wird, lädt das System die angegebene .dll im Kontext des neu gestarteten Prozesses vor dem Aufrufen der Einstiegspunktfunktion. Der .dll muss die -Klasse während der Initialisierungsprozedur registrieren und die CS_GLOBALCLASS Format angeben. Weitere Informationen finden Sie unter Klassenstile.
Verwenden Sie die Funktion UnregisterClass , um eine globale Anwendungsklasse zu entfernen und den ihr zugeordneten Speicher frei zu geben.
Lokale Anwendungsklassen
Eine lokale Anwendungsklasse ist jede Fensterklasse, die eine ausführbare Datei oder .dll für ihre exklusive Verwendung registriert. Obwohl Sie eine beliebige Anzahl lokaler Klassen registrieren können, ist es üblich, nur eine zu registrieren. Diese Fensterklasse unterstützt die Fensterprozedur des Standard Fensters der Anwendung.
Das System zerstört eine lokale Klasse, wenn das Modul, das sie registriert hat, geschlossen wird. Eine Anwendung kann auch die Funktion UnregisterClass verwenden, um eine lokale Klasse zu entfernen und den ihr zugeordneten Speicher frei zu geben.
So sucht das System eine Fensterklasse
Das System verwaltet eine Liste von Strukturen für jeden der drei Typen von Fensterklassen. Wenn eine Anwendung die Funktion CreateWindow oder CreateWindowEx aufruft, um ein Fenster mit einer angegebenen Klasse zu erstellen, verwendet das System das folgende Verfahren, um die Klasse zu suchen.
- Durchsuchen Sie die Liste der lokalen Anwendungsklassen nach einer Klasse mit dem angegebenen Namen, deren instance Handle dem instance Handle des Moduls entspricht. (Mehrere Module können denselben Namen verwenden, um lokale Klassen im selben Prozess zu registrieren.)
- Wenn der Name nicht in der Liste der lokalen Anwendungsklassen enthalten ist, durchsuchen Sie die Liste der globalen Anwendungsklassen.
- Wenn der Name nicht in der globalen Anwendungsklassenliste enthalten ist, durchsuchen Sie die Liste der Systemklassen.
Alle von der Anwendung erstellten Fenster verwenden dieses Verfahren, einschließlich fenstern, die vom System im Auftrag der Anwendung erstellt wurden, z. B. Dialogfelder. Es ist möglich, Systemklassen ohne Auswirkungen auf andere Anwendungen zu überschreiben. 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, aber nicht verhindert, dass andere Anwendungen die Systemklasse verwenden.
Registrieren einer Window-Klasse
Eine Fensterklasse definiert die Attribute eines Fensters, z. B. Stil, Symbol, Cursor, Menü und 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 Fensterklasse. Ü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 Formatelement der WNDCLASSEX-Struktur an. Geben Sie beim Registrieren einer lokalen Anwendungsklasse nicht die CS_GLOBALCLASS-Format an.
Wenn Sie die Fensterklasse mit der ANSI-Version von RegisterClassEx registrieren, RegisterClassExA, fordert die Anwendung an, dass das System Textparameter von Nachrichten mithilfe des ANSI-Zeichensatzes an die Fenster der erstellten Klasse übergibt. wenn Sie die -Klasse mit der Unicode-Version von RegisterClassEx, RegisterClassExW registrieren, fordert die Anwendung an, dass das System Textparameter von Nachrichten mithilfe des Unicode-Zeichensatzes an die Fenster der erstellten Klasse übergibt. Mit der IsWindowUnicode-Funktion können Anwendungen die Art jedes Fensters 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 aus dem hInstance-Member der WNDCLASSEX-Struktur , das an die RegisterClassEx-Funktion übergeben wird, wenn die Klasse registriert wird. Für DLLs muss das hInstance-Element das Handle für die .dll instance 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, verursacht dies eine Zugriffsverletzung, da sich die .dll, die die Fensterprozedur enthält, nicht mehr im Arbeitsspeicher befindet. Der Prozess muss alle Fenster zerstören, die die -Klasse verwenden, bevor der .dll entladen wird, und die UnregisterClass-Funktion 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 sie entsprechende Member in einer WNDCLASSEX-Struktur festlegt und die Struktur an die RegisterClassEx-Funktion übergibt. Die Funktionen GetClassInfoEx und GetClassLong rufen Informationen zu einer bestimmten Fensterklasse ab. 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 Window-Procedure-Adresse und ein instance Handle bereitstellt. 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. |
Adresse der Fensterprozedur | Zeiger auf die Funktion, die alle nachrichten verarbeitet, die an Fenster in der -Klasse gesendet werden und das Verhalten des Fensters definiert. |
Instanzhandle | Gibt die Anwendung oder .dll an, die die Klasse registriert hat. |
Klassencursor | Definiert den Mauscursor, den das System für ein Fenster der -Klasse anzeigt. |
Klassensymbole | Definiert das große Symbol und das kleine Symbol. |
Klassenhintergrundpinsel | Definiert die Farbe und das Muster, die den Clientbereich ausfüllen, wenn das Fenster geöffnet oder gezeichnet wird. |
Klassenmenü | Gibt das Standardmenü für Fenster an, die nicht explizit ein Menü definieren. |
Klassenstile | Definiert, wie das Fenster nach dem Verschieben oder Ändern der Größe aktualisiert wird, wie Doppelklicks mit der Maus verarbeitet werden, wie Platz für den Gerätekontext zugewiesen wird, und andere Aspekte des Fensters. |
Zusätzlicher 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 nutzen den zusätzlichen Arbeitsspeicher und können ihn für jeden anwendungsdefinierten Zweck verwenden. Das System initialisiert diesen Arbeitsspeicher auf Null. |
Zusätzlicher 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 Arbeitsspeicher auf Null. |
Klassenname
Jede Fensterklasse benötigt einen Klassennamen , um eine Klasse von einer anderen zu unterscheiden. Weisen Sie einen Klassennamen zu, indem Sie das 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. Außerdem sollten Sie Klassennamen so kurz wie möglich halten, da Klassennamen in der privaten Atomtabelle des Systems Leerzeichen belegen.
Die GetClassName-Funktion ruft den Namen der Klasse ab, zu der ein bestimmtes Fenster gehört.
Adresse der Fensterprozedur
Jede Klasse benötigt eine Fensterprozeduradresse, um den Einstiegspunkt der Fensterprozedur zu definieren, die zum Verarbeiten aller Nachrichten für Fenster in der -Klasse verwendet wird. Das System übergibt Nachrichten an die Prozedur, wenn das Fenster Aufgaben ausführen muss, z. B. das Malen des Clientbereichs oder das Reagieren auf Eingaben des Benutzers. Ein Prozess weist einer Klasse eine Fensterprozedur zu, indem seine Adresse in das lpfnWndProc-Element der WNDCLASSEX-Struktur kopiert wird. Weitere Informationen finden Sie unter Window Procedures.
Instanzhandle
Jede Fensterklasse erfordert ein instance-Handle, um die Anwendung oder .dll zu identifizieren, die die Klasse registriert hat. Das System benötigt instance Handles, um alle Module nachzuverfolgen. Das System weist jeder Kopie einer ausgeführten ausführbaren Datei oder .dll ein Handle zu.
Das System übergibt ein instance-Handle an die Einstiegspunktfunktion jeder ausführbaren Datei (siehe WinMain) und .dll (siehe DllMain). Die ausführbare Datei oder .dll weist dieses instance Handle der -Klasse zu, indem es in das hInstance-Element 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 die angegebene Form fest, wenn der Cursor in den Clientbereich des Fensters gelangt, und stellt sicher, dass diese Form beibehalten wird, während sie im Clientbereich verbleibt. Um einer Fensterklasse ein Cursor-Shape zuzuweisen, laden Sie mithilfe der LoadCursor-Funktion ein vordefiniertes Cursor-Shape, und weisen Sie dann das zurückgegebene Cursorhandle dem hCursor-Member der WNDCLASSEX-Struktur zu. Alternativ können Sie eine benutzerdefinierte Cursorressource bereitstellen und die LoadCursor-Funktion verwenden, um sie aus den Ressourcen der Anwendung zu laden.
Das System erfordert keinen Klassencursor. Wenn eine Anwendung das hCursor-Element der WNDCLASSEX-Struktur auf NULL festlegt, wird kein Klassencursor definiert. Das System geht davon aus, dass das Fenster die Cursorform jedes Mal festlegt, wenn sich der Cursor in das Fenster bewegt. Ein Fenster kann die Cursorform festlegen, indem die SetCursor-Funktion aufgerufen wird, wenn 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 über zwei Klassensymbole verfügen– ein großes und ein kleines. Das System zeigt das große Klassensymbol eines Fensters im Task-Switch-Fenster an, das angezeigt wird, wenn der Benutzer ALT+TAB drückt, und in den großen Symbolansichten der Taskleiste und des Explorers. Das kleine Klassensymbol wird 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 Handles der Symbole im hIcon - und hIconSm-Element der WNDCLASSEX-Struktur an. Die Symboldimensionen 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 bestimmen, indem Sie die SM_CXICON - und SM_CYICON-Werte 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-Member 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, aber kein kleines Klassensymbol angeben, erstellt das System ein kleines Klassensymbol basierend auf dem großen Symbol. Wenn Sie jedoch ein kleines, aber kein großes Klassensymbol 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 Vollfarbe oder einem Muster zu füllen, wodurch alle vorherigen Bilder von dieser Position entfernt werden, unabhängig davon, ob sie zum Fenster gehören oder nicht. 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 Pinsel.
Um einer Klasse einen Hintergrundpinsel zuzuweisen, erstellen Sie mithilfe der entsprechenden GDI-Funktionen einen Pinsel, und weisen Sie das zurückgegebene Pinselhandle dem hbrBackground-Member der WNDCLASSEX-Struktur zu.
Anstatt einen Pinsel zu erstellen, kann eine Anwendung den hbrBackground-Member auf einen der Standardfarbwerte des Systems festlegen. Eine Liste der Standardsystemfarbwerte finden Sie unter SetSysColors.
Um eine Standardsystemfarbe zu verwenden, muss die Anwendung den Wert der Hintergrundfarbe um eins erhöhen. Beispielsweise ist COLOR_BACKGROUND + 1 die Hintergrundfarbe des Systems. Alternativ können Sie die GetSysColorBrush-Funktion verwenden, um einen Handle für einen 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 seinen eigenen Hintergrund zeichnen, wenn es die WM_ERASEBKGND Nachricht empfängt.
Klassenmenü
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 Anwendung auswählen kann, die ausgeführt werden sollen.
Sie können einer Klasse ein Menü zuweisen, indem Sie das lpszMenuName-Member der WNDCLASSEX-Struktur auf die Adresse einer 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 vor dem Zuweisen des Werts das MAKEINTRESOURCE-Makro anwendet.
Das System erfordert kein Klassenmenü. Wenn eine Anwendung das lpszMenuName-Element der WNDCLASSEX-Struktur auf NULL festlegt, verfügen Fenster in der Klasse über keine Menüleisten. Auch wenn kein Klassenmenü angegeben ist, kann eine Anwendung beim Erstellen des Fensters dennoch eine Menüleiste für ein Fenster definieren.
Wenn ein Menü für eine Klasse angegeben wird und ein untergeordnetes Fenster dieser Klasse erstellt wird, wird das Menü ignoriert. Weitere Informationen finden Sie unter Menüs.
Klassenstile
Die Klassenstile definieren zusätzliche Elemente der Fensterklasse. Zwei oder mehr Stile können mit dem bitweisen OR-Operator (|) kombiniert werden. Um einer Fensterklasse eine Formatvorlage zuzuweisen, weisen Sie die Formatvorlage dem Formatmember der WNDCLASSEX-Struktur zu. Eine Liste der Klassenstile finden Sie unter Fensterklassenstile.
Klassen und Gerätekontexte
Ein Gerätekontext ist ein spezieller Satz 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 durch das System.
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, die vom System verwaltet werden. In solchen Fällen muss jedes Fenster den Gerätekontext vor dem Malen abrufen und initialisieren und nach dem Malen freigeben.
Um zu vermeiden, dass ein Gerätekontext bei jedem Malen in einem Fenster abgerufen wird, kann eine Anwendung den CS_OWNDC Stil für die Fensterklasse angeben. Dieser Klassenstil weist das System an, einen privaten Gerätekontext zu erstellen, d. h. für jedes Fenster in der Klasse einen eindeutigen Gerätekontext zuzuweisen. Die Anwendung muss den Kontext nur einmal abrufen und dann für alle nachfolgenden Malereien verwenden.
Zusätzlicher Klassenspeicher
Das System verwaltet intern eine WNDCLASSEX-Struktur für jede Fensterklasse im System. Wenn eine Anwendung eine Fensterklasse registriert, kann sie das System anweisen, eine Reihe zusätzlicher Bytes Arbeitsspeicher am Ende der WNDCLASSEX-Struktur zuzuweisen und anzufügen. Dieser Arbeitsspeicher wird als zusätzlicher Klassenspeicher bezeichnet und von allen Fenstern freigegeben, die zur Klasse gehören. Verwenden Sie den zusätzlichen Klassenspeicher, um alle Informationen zu speichern, die sich auf die Klasse beziehen.
Da zusätzlicher Arbeitsspeicher über den lokalen Heap des Systems zugewiesen wird, sollte eine Anwendung zusätzlichen Klassenspeicher sparsam verwenden. Die RegisterClassEx-Funktion schlägt fehl, wenn die menge des angeforderten zusätzlichen Klassenspeichers größer als 40 Bytes ist. Wenn eine Anwendung mehr als 40 Bytes benötigt, sollte sie ihren eigenen Arbeitsspeicher zuordnen und einen Zeiger auf den Arbeitsspeicher 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 Funktionen GetClassWord und GetClassLong . Das cbClsExtra-Element der WNDCLASSEX-Struktur gibt die Menge an zusätzlichem Klassenspeicher an, der zugewiesen werden soll. Eine Anwendung, die keinen zusätzlichen Klassenspeicher verwendet, muss den 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 als zusätzlicher Fensterspeicher bezeichnet wird. Beim Erstellen eines Fensters der -Klasse ordnet das System die angegebene Menge an zusätzlichem Fensterspeicher zu und fügt es an das Ende der Struktur des Fensters an. Eine Anwendung kann diesen Arbeitsspeicher verwenden, um fensterspezifische Daten zu speichern.
Da zusätzlicher Arbeitsspeicher über den lokalen Heap des Systems zugewiesen wird, sollte eine Anwendung zusätzlichen Fensterspeicher sparsam verwenden. Die RegisterClassEx-Funktion schlägt fehl, wenn die angeforderte Zusätzliche Fensterspeichermenge größer als 40 Bytes ist. Wenn eine Anwendung mehr als 40 Bytes benötigt, sollte sie ihren eigenen Arbeitsspeicher zuweisen und einen Zeiger auf den Arbeitsspeicher 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-Element der WNDCLASSEX-Struktur gibt die Menge an zusätzlichem Fensterspeicher an, der zugewiesen werden soll. Eine Anwendung, die den Arbeitsspeicher nicht verwendet, muss cbWndExtra mit null initialisieren.