TN001: Von Fensterklassen

Diese Applikationsschrift beschreibt die MFC-Routinen, die die spezielle WNDCLASSes benötigt Microsoft Windows registrieren. WNDCLASS Attribute von MFC verwendet und Windows diskutiert werden.

Das Problem

Die Attribute eines Objekts CWnd , wie ein HWND in Windows werden an zwei Orten gespeichert: das Window-Objekt und der WNDCLASS. Einer WNDCLASS ist anders als eine C++-Klasse. Der Name der WNDCLASS ist an allgemeine Schaffung Fensterfunktionen wie AfxRegisterWndClass und CFrameWnd::Create im LpszClassName -Parameter übergeben.

Diese WNDCLASS muss registriert werden, über eine der vier Mittel:

WNDCLASSes und MFC

Die WNDCLASS Struktur besteht aus verschiedenen Bereichen, die eine Fensterklasse beschreiben. Im folgenden werden die Felder und ihre Verwendung in einer MFC-Anwendung.

Stil Stil des Fensters: siehe unten
LpfnWndProc fenster Proc, muss AfxWndProc sein
WNDCLAS nicht verwendet (sollte null sein)
CbWndExtra nicht verwendet (sollte null sein)
HInstance automatisch gefüllt mit AfxGetInstanceHandle
HIcon symbol für frame-fenster, siehe unten
HCursor cursor ist maus über fenster, siehe unten
HbrBackground hintergrundfarbe, siehe unten
LpszMenuName nicht verwendet (sollte NULL sein)
LpszClassName klassenname, siehe unten

Bereitgestellt von WNDCLASSes

In früheren Versionen von MFC (vor dem MFC 4.0) gab es eine Reihe von vordefinierten Fensterklassen zur Verfügung gestellt. Diese Fenster-Klassen werden nicht mehr standardmäßig bereitgestellt, wegen der technischen Probleme im Zusammenhang mit Versionsverwaltung (mehrere Versionen von MFC geladen in einem Adressraum) als auch Bedenken in Bezug auf die Tatsache, dass MFC-Anwendungen und OLE-Steuerelemente die MFC-DLLs verwenden kann.

Die folgende Referenz dient zur Code migrieren, die zuvor bereitgestellten WNDCLASSes verwendet. Anwendungen sollten anstelle von diesen Klassen ist (mit den entsprechenden Parametern) verwenden.

Das folgende Beispiel zeigt die Klassen und ihre Attribute:

Wenn die Anwendung eine Ressource mit der ID angegebene Ressource-ID (z. B. AFX_IDI_STD_FRAME) enthält, verwendet MFC die Ressource. Andernfalls wird die Standardressource verwendet. Für das Symbol das Symbol standard-Anwendung wird verwendet, und für den Cursor, der Standardpfeil Cursor verwendet wird.

Es gibt zwei Symbole, die Unterstützung von MDI-Anwendungen mit einzelnen Dokumenttypen (ein Symbol für das Hauptprogramm, das andere Symbol für Windows Ikone Dokument/MDIChild). Für mehrere Dokumenttypen mit unterschiedlichen Symbolen müssen Sie zusätzliche WNDCLASSes registrieren oder verwenden Sie die CFrameWnd::LoadFrame -Funktion.

CFrameWnd::LoadFrame wird automatisch registrieren einer WNDCLASS mit die Standardattributen "AfxFrameOrView" sondern die Symbol-ID, die Sie als ersten Parameter LoadFrame angeben.

Die Werte für die Hintergrundfarbe und Cursor für die MDIFrameWnd werden nicht verwendet, da der Clientbereich der MDIFrameWnd durch das Fenster "MDICLIENT" völlig bedeckt ist. Microsoft fördert nicht bilden von Unterklassen Fenster "MDICLIENT" so verwenden Sie die standard-Farben und Cursortypen wenn möglich.

Bilden von Unterklassen für Steuerelemente

Wenn Sie Unterklasse oder Superklasse Windows (z. B. CButton) dann die Klasse automatisch steuern bekommt der WNDCLASS Attribute in die Windows-Implementierung des Steuerelements bereitgestellt.

Die Funktion ist

MFC stellt eine Hilfsfunktion für die Registrierung einer Fensterklasse. Gegeben, einen Satz von Attributen (Klasse Fensterstil, Cursor, Hintergrundpinsel und Symbol), ist ein synthetischer Name generiert, und die daraus resultierende Fensterklasse registriert ist. Zum Beispiel,

const Char * ist (UINT nClassStyle, HCURSOR hCursor, HBRUSH HbrBackground, HICON hIcon)

Diese Funktion gibt einen temporären String von der generierten registrierte Fensterklassenname. Finden Sie in der Class Library Reference für weitere Informationen.

Die zurückgegebene Zeichenfolge ist eine temporäre Zeiger auf eine statische Zeichenfolgenpuffer bis zum nächsten Aufruf von istgültig ist. Wenn Sie diese Zeichenfolge um beibehalten möchten, speichern Sie es in ein CString -Variable. Zum Beispiel,

CString StrWndClass = ist (CS_DBLCLK,...);
...
CWnd * pWnd = neue CWnd;
pWnd-≫Erstellen Sie (StrWndClass,...);

Ist löst ein CResourceException , wenn die Window-Klasse konnte nicht registriert (wegen der schlechten Parameter, oder aus der Windows-Speicher).

Der "registerClass" und AfxRegisterClass-Funktionen

Wenn Sie etwas komplexer wollen als was ist bietet, können Sie die Windows-API "registerClass" oder die MFC-Funktion AfxRegisterClassaufrufen. Die CWnd, CFrameWnd und CMDIChildWnd Erstellen Funktionen nehmen ein Zeichenfolgenname LpszClassName für die Window-Klasse als ersten Parameter. Alle Fenster-Klassennamen kann verwendet werden, unabhängig davon, wie sie eingetragen wurde,.

Es ist wichtig, AfxRegisterClass (oder ist) in einer Win32-DLL verwenden. Win32 nicht automatisch abmelden Klassen, die von einer DLL registriert, so dass dies ausdrücklich getan werden muss, wenn die DLL beendet wird. Mithilfe von AfxRegisterClass anstelle der RegisterClass erfolgt dies automatisch für Sie. AfxRegisterClass verwaltet eine Liste der eindeutige Klassen durch die DLL registriert und wird automatisch dann aufzuheben, wenn die DLL beendet wird. Wenn Sie "registerClass" in einer DLL zu verwenden, müssen Sie sicherstellen, dass alle Klassen nicht registriert sind, wenn die DLL (in der DllMain -Funktion) beendet wird. Anderenfalls möglicherweise RegisterClass unerwartet fehlschlagen, wenn die DLL von einem anderen Client-Anwendung verwendet wird.

Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie

Index