Udostępnij za pośrednictwem


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:

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 WNDCLASSes 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ę AfxRegisterClassMFC . 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