TN001: rejestracja klas okien
Uwaga ta opisuje procedury MFC, które rejestrują specjalne WNDCLASSes wymagane przez Microsoft Windows.Szczególne WNDCLASS omawiane są atrybuty używane przez MFC i system Windows.
Problem
Atrybuty CWnd obiektu, jak HWND obsługę w systemie Windows, są przechowywane w dwóch miejscach: obiekt window i WNDCLASS.Nazwa WNDCLASS jest przekazywany do funkcji tworzenia Ogólne okna takie jak CWnd::Create i CFrameWnd::Create w lpszClassName parametru.
To WNDCLASS musi być zarejestrowany przez jeden z czterech oznacza:
Niejawnie przy użyciu MFC, pod warunkiem, WNDCLASS.
Niejawnie przez rozszerzanie sterowania systemu Windows (lub niektórych innych kontroli).
Jawnie przez wywołanie MFC AfxRegisterWndClass lub AfxRegisterClass.
Jawnie przez wywołanie procedury Windows RegisterClass.
Pola WNDCLASS
WNDCLASS Struktura składa się z różnych dziedzin, które opisują klasy okna.W poniższej tabeli przedstawiono pola i określa, jak są używane w aplikacji MFC:
Pole |
Opis |
---|---|
lpfnWndProc |
Okno proc musi byćAfxWndProc |
cbClsExtra |
Nie używany (powinno być równe zero) |
cbWndExtra |
Nie używany (powinno być równe zero) |
hInstance |
automatycznie wypełnioneAfxGetInstanceHandle |
hIcon |
Ikona dla windows ramki, patrz poniżej |
hCursor |
kursor dla kiedy kursor znajduje się nad okna, patrz poniżej |
hbrBackground |
kolor tła, patrz poniżej |
lpszMenuName |
Nie używany (powinna być równa NULL) |
lpszClassName |
Nazwa klasy, patrz poniżej |
Pod warunkiem WNDCLASSes
Starsze niż MFC (przed MFC 4.0), pod warunkiem kilka wstępnie zdefiniowanych klas okna.Domyślnie nie są już dostępne są te klasy okna.Aplikacje powinny używać AfxRegisterWndClass z odpowiednimi parametrami.
Jeśli aplikacja zawiera zasób z Identyfikatorem określonego zasobu (na przykład AFX_IDI_STD_FRAME), MFC użyje tego zasobu.W przeciwnym razie będzie używać zasobu domyślnej.Ikony ikona standardowych aplikacji jest używany, a kursor jest używany standard strzałki.
Dwie ikony obsługi aplikacji MDI z typami jednolitego dokumentu: jedną ikonę dla głównej aplikacji, inne ikony dla windows ikony dokumentu/MDIChild.Dla wielu typów dokumentów z różnych ikon, należy zarejestrować dodatkowe WNDCLASSes lub użyj CFrameWnd::LoadFrame funkcji.
CFrameWnd::LoadFramezarejestruje WNDCLASS za pomocą Identyfikatora ikona określić jako pierwszy parametr i następujące atrybuty standardowe:
Klasa stylu: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
Ikona AFX_IDI_STD_FRAME
strzałki kursora
Kolor tła COLOR_WINDOW
Wartości koloru tła i kursora dla CMDIFrameWnd nie są używane od obszaru klienckiego CMDIFrameWnd jest całkowicie pokryte przez MDICLIENT okna.Microsoft nie będzie zachęcać do podklasy MDICLIENT okna więc używać kolorów standardowych i typów kursora, gdy jest to możliwe.
Rozszerzanie i formanty Superclassing
Jeśli superklasy systemu Windows lub podklasy można kontrolować (na przykład CButton), a następnie automatycznie pobiera klasy WNDCLASS atrybuty dostarczone we wdrażaniu systemu Windows tego formantu.
Funkcja AfxRegisterWndClass
MFC zapewnia funkcja pomocnika do rejestrowania klasy okna.Biorąc pod uwagę zestaw atrybutów (stylu klasy okna, kursor, Pędzel tła i ikona), syntetycznych nazwa jest generowana i jest zarejestrowana w wynikowe klasy okna.Na przykład:
const char* AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon);
Ta funkcja zwraca ciąg tymczasowy wygenerowany okno zarejestrowane nazwy klasy.Aby uzyskać więcej informacji o tej funkcji, zobacz AfxRegisterWndClass.
Zwrócony ciąg jest tymczasowe wskaźnik do buforu ciągów statyczne.Jest to ważne do następne wywołanie AfxRegisterWndClass.Jeśli chcesz zachować ten ciąg wokół przechowywać ją w CString zmiennych, jak w poniższym przykładzie:
CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);
...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);
...
AfxRegisterWndClassrzucać CResourceException Jeśli klasy okna nie można zarejestrować (ze względu na złe parametry lub za mało pamięci w systemie Windows).
RegisterClass i funkcji AfxRegisterClass
Jeśli chcesz zrobić coś bardziej wyrafinowane niż to, co AfxRegisterWndClass miejsce, można wywołać interfejsu API systemu Windows RegisterClass lub funkcja MFC AfxRegisterClass.CWnd, CFrameWnd i CMDIChildWndCreate funkcje podjąć lpszClassName ciąg nazwy klasy okna jako pierwszy parametr. Można użyć dowolnej nazwy klasy okna zarejestrowane, niezależnie od metody użytej do go zarejestrować.
Ważne jest, aby użyć AfxRegisterClass (lub AfxRegisterWndClass) w bibliotece DLL na Win32.Win32 nie automatycznie wyrejestrować klas zarejestrowanych przez bibliotekę DLL, więc musi jawnie wyrejestrować klas, kiedy zakończone biblioteki DLL.Za pomocą AfxRegisterClass zamiast RegisterClass jest obsługiwana automatycznie za Ciebie.AfxRegisterClassutrzymuje listę unikatowych klas zarejestrowanych przez bibliotekę DLL i automatycznie będzie je wyrejestrować, gdy zakończy biblioteki DLL.Użycie RegisterClass w bibliotece DLL, musi zapewnić wszystkich klas są zarejestrowane, jeśli biblioteka DLL jest zakończona (w swojej DllMain funkcji).Niezastosowanie się do tego może powodować RegisterClass nieoczekiwane niepowodzenie, kiedy inna aplikacja klient próbuje użyć biblioteki DLL.