TN001: Rejestracja klas okno
Uwaga ta opisuje procedur MFC, które zarejestrować specjalne WNDCLASSes wymagane przez system Microsoft Windows.Szczególne WNDCLASS omówione są atrybuty używane MFC i systemu Windows.
Problem
Atrybuty CWnd obiektów, takich jak: HWND obsługi systemu Windows, są przechowywane w dwóch miejscach: obiekt window i WNDCLASS.Nazwa WNDCLASS jest przekazywana do funkcji tworzenia Ogólne okna, takich jak CWnd::Create i CFrameWnd::Create w lpszClassName parametru.
To WNDCLASS musi być zarejestrowany przez jeden z czterech oznacza:
Używając niejawnie MFC, pod warunkiem WNDCLASS.
Niejawnie przez tworzenie podklas sterowania systemu Windows (lub niektórych innych kontroli).
Jawnie, wywołując MFC AfxRegisterWndClass lub AfxRegisterClass.
Jawnie, wywołując rutynowych Windows RegisterClass.
Pola WNDCLASS
WNDCLASS Struktury składa się z różnych pól, które opisują klasy okna.W poniższej tabeli przedstawiono pola i określa, w jaki sposób są używane w aplikacji MFC:
Pole |
Opis |
---|---|
lpfnWndProc |
musi być proc oknaAfxWndProc |
cbClsExtra |
Nie używany (powinny być równe zero) |
cbWndExtra |
Nie używany (powinny być równe zero) |
hInstance |
automatycznie wypełnioneAfxGetInstanceHandle |
hIcon |
Ikona ramki systemu windows, zobacz poniżej |
hCursor |
kursor dla gdy kursor znajduje się nad okno, patrz poniżej |
hbrBackground |
kolor tła, zobacz poniżej |
lpszMenuName |
Nie używany (powinna być NULL) |
lpszClassName |
Nazwa klasy, patrz poniżej |
Pod warunkiem WNDCLASSes
Wcześniejsze wersje MFC (przed MFC 4.0), pod warunkiem kilka wstępnie zdefiniowanych klas okna.Domyślnie dostępne są już te klasy okna.Aplikacje powinny używać AfxRegisterWndClass z odpowiednimi parametrami.
Jeśli aplikacja zawiera zasób o identyfikatorze określony zasób (na przykład AFX_IDI_STD_FRAME), MFC będzie używać tego zasobu.W przeciwnym razie będzie używać zasobu domyślnej.Ikony używana jest ikona aplikacji standardowych i kursora, używany jest standardowy kursor.
Dwie ikony obsługi aplikacji MDI z typami jednolitego dokumentu: jedną ikonę aplikacji głównej, inne ikona ikony dokumentu/MDIChild systemu windows.Dla wielu typów dokumentów z różnych ikon, należy zarejestrować dodatkowe WNDCLASSes lub wykorzystania CFrameWnd::LoadFrame funkcji.
CFrameWnd::LoadFramezarejestruje WNDCLASS przy użyciu Identyfikatora ikonę określić jako pierwszy parametr i następujące atrybuty standardowe:
Klasa styl: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
Ikona AFX_IDI_STD_FRAME
strzałki kursora
Kolor tła COLOR_WINDOW
Wartości dla koloru tła i kursor dla CMDIFrameWnd nie są używane od obszaru klienckiego CMDIFrameWnd jest całkowicie objęte MDICLIENT okna.Microsoft nie będzie zachęcać podklasy MDICLIENT okno tak używać standardowych kolorów i typy kursora, gdy jest to możliwe.
Tworzenie podklasy i formanty Superclassing
Jeżeli użytkownik podklasy lub superklasy systemu Windows (na przykład CButton), a następnie klasy automatycznie pobiera WNDCLASS atrybuty w realizacji systemu Windows tego formantu.
Funkcja AfxRegisterWndClass
MFC udostępnia funkcję Pomocnik rejestracji klasy okna.Biorąc pod uwagę zestaw atrybutów (styl klasy okna, kursor, Pędzel tła i ikona), syntetycznych nazwa jest generowana i klasy okna wynikowy jest zarejestrowany.Na przykład,
const char* AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon);
Ta funkcja zwraca ciąg tymczasowe generowanych okno zarejestrowane nazwy klasy.Aby uzyskać więcej informacji na temat tej funkcji, zobacz AfxRegisterWndClass.
Zwrócony ciąg jest tymczasowy wskaźnik do buforu ciągów statyczne.Jest ważne, do następne wywołanie AfxRegisterWndClass.Jeśli chcesz zachować ten ciąg wokół, przechowywać ją w CString zmiennej, jak w poniższym przykładzie:
CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);
...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);
...
AfxRegisterWndClasswygeneruje CResourceException Jeśli klasy okna nie można zarejestrować (z powodu złych parametrów, lub o braku pamięci systemu Windows).
RegisterClass i funkcji AfxRegisterClass
Jeżeli chcesz zrobić coś bardziej zaawansowane niż co AfxRegisterWndClass miejsce, można wywołać interfejsu API systemu Windows RegisterClass lub funkcja MFC AfxRegisterClass.CWnd, CFrameWnd i CMDIChildWndCreate podjąć funkcji lpszClassName ciąg nazwy klasy okna jako pierwszy parametr.Można użyć nazwy do klasy okno zarejestrowane, niezależnie od metody użytej do go zarejestrować.
Jest ważne, aby użyć AfxRegisterClass (lub AfxRegisterWndClass) w bibliotece DLL w Win32.Automatycznie Win32 nie wyrejestrować klas zarejestrowanych przez bibliotekę DLL, więc musi jawnie wyrejestrować klas, gdy biblioteka DLL jest zakończony.Za pomocą AfxRegisterClass zamiast RegisterClass jest obsługiwane automatycznie dla Ciebie.AfxRegisterClassutrzymuje listę unikatowych klas zarejestrowanych przez bibliotekę DLL i automatycznie będzie je wyrejestrować, gdy biblioteka DLL kończy działanie.Podczas używania RegisterClass w bibliotece DLL musi zapewnić wszystkie klasy są niezarejestrowanych, gdy biblioteka DLL jest zakończony (w sieci DllMain funkcji).Niewykonanie tego może spowodować RegisterClass nieoczekiwane niepowodzenie, gdy inna aplikacja klient próbuje użyć biblioteki DLL.