TN001: rejestracja klas okien
W tej notatce opisano procedury MFC, które rejestrują specjalne es WNDCLASSwymagane przez system Microsoft Windows. Omówiono określone WNDCLASS
atrybuty używane przez MFC i Windows.
The Problem
Atrybuty obiektu CWnd , takie jak HWND
uchwyt w systemie Windows, są przechowywane w dwóch miejscach: obiekt okna i WNDCLASS
. Nazwa WNDCLASS
obiektu jest przekazywana do ogólnych funkcji tworzenia okien, takich jak CWnd::Create i CFrameWnd::Create w parametrze lpszClassName .
Należy to WNDCLASS
zarejestrować za pomocą jednego z czterech środków:
Niejawnie przy użyciu udostępnionego
WNDCLASS
MFC .Niejawnie przez podklasowanie kontrolki systemu Windows (lub innej kontrolki).
Jawnie wywołując klasę MFC AfxRegisterWndClass lub AfxRegisterClass.
Jawnie wywołując rutynową klasę RegisterClass systemu Windows.
Pola WNDCLASS
Struktura WNDCLASS
składa się z różnych pól opisujących klasę okien. W poniższej tabeli przedstawiono pola i określono sposób ich użycia w aplikacji MFC:
Pole | Opis |
---|---|
lpfnWndProc | proc, musi być elementem AfxWndProc |
cbClsExtra | nieużytne (powinno być zero) |
cbWndExtra | nieużytne (powinno być zero) |
hInstance | automatycznie wypełniane elementem AfxGetInstanceHandle |
hIcon | ikona okien ramowych, zobacz poniżej |
hCursor | kursor, gdy wskaźnik myszy znajduje się nad oknem, zobacz poniżej |
hbrBackground | kolor tła, zobacz poniżej |
lpszMenuName | nieużytne (powinno mieć wartość NULL) |
lpszClassName | nazwa klasy, zobacz poniżej |
Podane WNDCLASSes
Wcześniejsze wersje MFC (przed MFC 4.0) udostępniały kilka wstępnie zdefiniowanych klas okien. Te klasy okien nie są już udostępniane domyślnie. Aplikacje powinny używać AfxRegisterWndClass
z odpowiednimi parametrami.
Jeśli aplikacja udostępnia zasób o określonym identyfikatorze zasobu (na przykład AFX_IDI_STD_FRAME), usługa MFC będzie używać tego zasobu. W przeciwnym razie zostanie użyty zasób domyślny. Dla ikony jest używana standardowa ikona aplikacji, a dla kursora jest używany standardowy kursor strzałki.
Dwie ikony obsługują aplikacje MDI z pojedynczymi typami dokumentów: jedną ikoną głównej aplikacji, drugą ikoną kultowego dokumentu/okna MDIChild. W przypadku wielu typów dokumentów z różnymi ikonami należy zarejestrować dodatkowe WNDCLASS
es lub użyć funkcji CFrameWnd::LoadFrame .
CFrameWnd::LoadFrame
Zarejestruje WNDCLASS
przy użyciu identyfikatora ikony, który określisz jako pierwszy parametr i następujące atrybuty standardowe:
styl klasy :
CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
AFX_IDI_STD_FRAME ikona
kursor strzałki
kolor tła COLOR_WINDOW
Wartości koloru tła i kursora dla CMDIFrameWnd nie są używane, ponieważ obszar klienta obiektu CMDIFrameWnd
jest całkowicie objęty oknem MDICLIENT . Firma Microsoft nie zachęca do podklasowania okna MDICLIENT , dlatego w miarę możliwości używaj standardowych kolorów i typów kursorów.
Podklasy i kontrolek superklasy
Jeśli podklasa lub superklasa kontrolki systemu Windows (na przykład CButton), klasa automatycznie pobiera WNDCLASS
atrybuty podane w implementacji tej kontrolki systemu Windows.
Funkcja AfxRegisterWndClass
MFC udostępnia funkcję pomocnika służącą do rejestrowania klasy okien. Biorąc pod uwagę zestaw atrybutów (styl klasy okna, kursor, szczotkę tła i ikonę), jest generowana nazwa syntetyczna, a wynikowa klasa okna jest rejestrowana. Przykład:
const char* AfxRegisterWndClass(UINT nClassStyle,
HCURSOR hCursor,
HBRUSH hbrBackground,
HICON hIcon);
Ta funkcja zwraca tymczasowy ciąg wygenerowanej nazwy klasy zarejestrowanego okna. Aby uzyskać więcej informacji na temat tej funkcji, zobacz AfxRegisterWndClass.
Zwrócony ciąg jest tymczasowym wskaźnikiem do buforu ciągów statycznych. Jest ona prawidłowa do następnego wywołania metody AfxRegisterWndClass
. Jeśli chcesz zachować ten ciąg, zapisz go w zmiennej CString , jak w tym przykładzie:
CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);
...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);
...
AfxRegisterWndClass
zgłosi wyjątek CResourceException , jeśli nie można zarejestrować klasy okna (z powodu nieprawidłowych parametrów lub braku pamięci systemu Windows).
Funkcje RegisterClass i AfxRegisterClass
Jeśli chcesz zrobić coś bardziej zaawansowanego niż to, co AfxRegisterWndClass
zapewnia, możesz wywołać interfejs API RegisterClass
systemu Windows lub funkcję AfxRegisterClass
MFC . Funkcje CWnd
, CFrameWnd i CMDIChildWndCreate
przyjmują nazwę ciągu lpszClassName dla klasy okna jako pierwszy parametr. Możesz użyć dowolnej zarejestrowanej nazwy klasy okna, niezależnie od metody użytej do jej zarejestrowania.
Ważne jest, aby używać AfxRegisterClass
(lub AfxRegisterWndClass
) w dll w systemie Win32. Win32 nie wyrejestruje automatycznie klas zarejestrowanych przez bibliotekę DLL, dlatego należy jawnie wyrejestrować klasy po zakończeniu działania biblioteki DLL. AfxRegisterClass
Użycie zamiast RegisterClass
tego jest obsługiwane automatycznie. AfxRegisterClass
Utrzymuje listę unikatowych klas zarejestrowanych przez bibliotekę DLL i automatycznie wyrejestruje je po zakończeniu działania biblioteki DLL. W przypadku użycia RegisterClass
w bibliotece DLL należy upewnić się, że wszystkie klasy są wyrejestrowane po zakończeniu biblioteki DLL (w funkcji DllMain ). Niepowodzenie tego może spowodować RegisterClass
nieoczekiwane niepowodzenie, gdy inna aplikacja kliencka próbuje użyć biblioteki DLL.
Zobacz też
Uwagi techniczne według numerów
Uwagi techniczne według kategorii