Freigeben über


TN001: Fensterklassen-Registrierung

Dieser Hinweis wird die MFC-Routinen, die eine spezielle WNDCLASS es registrieren, das von Microsoft Windows nicht erforderlich ist.Bestimmte WNDCLASS-Attribute, die von MFC verwendet werden und Windows werden erläutert.

Das Problem

Die Attribute eines CWnd-Objekts, z. B. ein HWND Handle in Windows, werden in zwei Orten gespeichert: WNDCLASS und das Fensterobjekt.Der Name WNDCLASS wird für allgemeine Features wie CWnd::Create Builds Fenster und CFrameWnd::Create im lpszClassName-Parameter übergeben.

Dieses WNDCLASS muss durch einen von vier registrierten Folgendes bedeutet:

  • Implizit mithilfe von MFC bereitgestellte WNDCLASS.

  • Implizit durch das Unterordnen des Windows-Steuerelements (oder eines anderen Steuerelements).

  • Explizit durch Aufrufen von MFC AfxRegisterWndClass oder AfxRegisterClass.

  • Explizit durch Aufrufen der RegisterClass Windows-Routine.

WNDCLASS-Felder

Die WNDCLASS-Struktur besteht aus mehreren Feldern, die eine Fensterklasse beschreiben.In der folgenden Tabelle werden die Felder fest und gibt an, wie sie in einer MFC-Anwendung verwendet werden:

Feld

Beschreibung

lpfnWndProc

Fensterprozedur, muss sein AfxWndProc

cbClsExtra

Nicht verwendet werden sollte (null)

cbWndExtra

Nicht verwendet werden sollte (null)

hInstance

AfxGetInstanceHandle mit automatisch eingetragen

hIcon

Symbol für Rahmenfenster finden Sie unten

hCursor

Cursor für den fall, dass Maus über Fenster ist, finden Sie unten

hbrBackground

Hintergrundfarbe finden Sie unten

lpszMenuName

nicht verwendet (sollte NULL sein)

lpszClassName

Klassenname finden Sie unten

Das bereitgestellte WNDCLASSes

Frühere Versionen von MFC (vor MFC 4.0), sofern eine Reihe vordefinierter Fensterklassen.Diese Fensterklassen werden standardmäßig nicht mehr bereitgestellt.Anwendungen sollten AfxRegisterWndClass mit den entsprechenden Parametern verwenden.

Wenn die Anwendung eine Ressource mit dem angegebenen Ressourcen-ID (z. B. AFX_IDI_STD_FRAME, verwendet MFC) stellt diese Ressource.Andernfalls wird die Ressource.Für das Symbol wird das standardmäßige anwendungssymbol verwendet und für den Cursor, wird der Standardwert pfeil-Cursor verwendet.

Zwei Symbole unterstützen MDI-Anwendungen mit einer einzigen Dokumenttypen: ein Symbol für die Hauptanwendung, das andere Symbol für ikonenhaftes Dokument/MDIChild-Fenster.Bei mehreren Dokumenttypen mit unterschiedlichen Symbolen, müssen Sie zusätzliche WNDCLASS es registrieren oder die CFrameWnd::LoadFrame-Funktion verwenden.

CFrameWnd::LoadFrame registriert WNDCLASS mit dem Symbol ID, die Sie als ersten Parameter und die folgenden Standard-Attribute angeben:

  • Klassen für: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW.

  • Symbol AFX_IDI_STD_FRAME

  • Pfeilcursor

  • COLOR_WINDOW-Hintergrundfarbe

Die Werte für Hintergrundfarbe und der Cursor für CMDIFrameWnd werden nicht verwendet, da der Clientbereich CMDIFrameWnd vollständig durch das Fenster MDICLIENT abgedeckt wird.Microsoft regt nicht das Unterordnen des Fensters angezeigt, sodass MDICLIENT verwenden Sie die Standardfarben und die Cursor-Typen, sofern dies möglich ist.

Erstellen von Unterklassen und Superclassing-Kontrollen

Wenn Sie unterordnen oder übergeordnete Klasse ein Windows-Steuerelement (z. B. CButton) dann die Klasse ruft automatisch die WNDCLASS-Attribute ab, die in der Windows-Implementierung dieses Steuerelements bereitgestellt werden.

Die AfxRegisterWndClass-Funktion

MFC stellt eine Hilfsfunktion zum Registrieren einer Fensterklasse bereit.Dargestellt wird es wird ein Satz von Attributen (Fensterklassenstil, Cursor, Hintergrundpinsel und Symbol), ein synthetischer Name generiert, und die resultierende Fensterklasse wird registriert.Beispiel:

const char* AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon);

Diese Funktion gibt eine temporäre Zeichenfolge Fensterklassen registrierten des generierten Namen zurück.Weitere Informationen zu dieser Funktion finden Sie unter AfxRegisterWndClass.

Die zurückgegebene Zeichenfolge ist ein temporärer Zeiger auf einen statischen Zeichenfolgenpuffer.Sie ist bis zum nächsten Aufruf von AfxRegisterWndClass gültig.Wenn Sie ungefähr diese Zeichenfolge speichern möchten, speichern Sie sie in einer CString-Variable, wie in diesem Beispiel:

CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);
...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);
...

AfxRegisterWndClass löst CResourceException wenn die Fensterklasse aus, die zum Registrieren fehlgeschlagen ist (entweder aufgrund ungültiger Parameter oder aus Windows-Arbeitsspeicher out).

Die Funktionen RegisterClass und AfxRegisterClass

Wenn Sie alles tun möchten, das als ausgereifter ist, das AfxRegisterWndClass bereitstellt, können Sie die Windows-API RegisterClass oder die MFC-Funktion AfxRegisterClass aufrufen.CWnd, die CFrameWnd und CMDIChildWndCreate-Funktionen akzeptieren einen lpszClassName Zeichenfolgennamen für die Fensterklasse als erster Parameter.Sie können jeden registrierten Fensterklassen, unabhängig davon, welche Methode verwenden, die Sie verwenden, um sie zu registrieren.

Es ist wichtig, AfxRegisterClass (oder AfxRegisterWndClass) in einer DLL auf Win32 zu verwenden.Win32 nicht automatisch hebt die Registrierung Klassen durch eine DLL registriert sind. Sie müssen also explizit Klassen Registrierung aufheben, wenn die DLL beendet wird.Indem AfxRegisterClass anstelle RegisterClass verwendet, wird dieses automatisch behandelt.AfxRegisterClass führt eine Liste von eindeutigen Klassen, die von der DLL registriert werden und wird sie automatisch Registrierung aufheben, wenn die DLL beendet wird.Wenn Sie RegisterClass in einer DLL verwenden, müssen Sie sicherstellen, dass alle Klassen, deren Registrierung aufgehoben werden, wenn die DLL beendet wird (der Funktion) DllMain.Andernfalls kann RegisterClass hat unerwartet beendet, wenn eine andere Clientanwendung versucht, die DLL zu verwenden.

Siehe auch

Weitere Ressourcen

Technische Hinweise durch Zahl

Technische Hinweise nach Kategorie