TN001: Okno klasy rejestracji

Uwaga ta opisuje procedury MFC, które rejestrują specjalne es WNDCLASSwymagane przez system Microsoft Windows. Określonych atrybutów WNDCLASS używany przez MFC i omówiono systemu Windows.

Problem

Atrybuty obiektu CWnd , podobnie jak HWND w systemie Windows są przechowywane w dwóch miejscach: obiekt window i WNDCLASS. WNDCLASS jest inny niż klasa C++. Nazwa WNDCLASS jest przekazywany do funkcji Ogólne okna Tworzenie, takich jak CWnd::Create i CFrameWnd::Create w parametrze lpszClassName.

Ta WNDCLASS musi być zarejestrowany przez jednego z czterech środków:

WNDCLASSes i MFC

Struktura WNDCLASS składa się z różnych dziedzin, które opisują klasy okna. Poniżej przedstawiono pola i jak są używane w aplikacji MFC.

Styl Styl okna: patrz poniżej
LpfnWndProc okno proc, musi być AfxWndProc
CbClsExtra nieużywany (powinny być równe zero)
CbWndExtra nieużywany (powinny być równe zero)
Wystąpienie HInstance automatycznie wypełnione AfxGetInstanceHandle
HIcon ikona ramki windows, zobacz poniżej
HCursor kursor dla gdy kursor znajduje się nad okno, patrz poniżej
HbrBackground kolor tła, patrz poniżej
LpszMenuName nieużywany (powinien być NULL)
LpszClassName nazwa klasy, patrz poniżej

Pod warunkiem WNDCLASSes

W poprzednich wersjach MFC (przed wprowadzeniem MFC 4.0) odbyto szereg predefiniowanych klas okna pod warunkiem. Te klasy okno nie znajdują się domyślnie z powodu problemów technicznych związanych z wersji (wiele wersji MFC załadowane w jeden adres miejsca), a także obawy związane z faktem, że zarówno w aplikacjach MFC, jak i formanty OLE może używać biblioteki MFC DLL.

Następujące odwołanie znajduje się w celu migracji kod, który używa wcześniej pod WNDCLASSes. Aplikacje powinny używać AfxRegisterWndClass (z odpowiednimi parametrami) zamiast z tych klas.

Poniżej przedstawiono ich atrybutów i klas:

Jeśli aplikacja zawiera zasób o identyfikatorze ID (na przykład AFX_IDI_STD_FRAME) określonego zasobu, MFC użyje tego zasobu. W przeciwnym razie zasobów domyślnie jest używany. Ikony ikona standardowych aplikacji jest używany, oraz kursora, kursor standardowy strzałka jest używany.

Istnieją dwie ikony, które obsługują aplikacje MDI z typami jednolitego dokumentu (jedna ikona dla aplikacji głównej, inne ikona ikony dokumentu/MDIChild systemu windows). Dla wielu typów dokumentów z różnymi ikonami musi rejestrować dodatkowe es WNDCLASSlub użyj funkcji CFrameWnd::LoadFrame.

CFrameWnd::LoadFrame zarejestruje automatycznie WNDCLASS przy użyciu standardowych atrybutów "AfxFrameOrView", ale przy użyciu Identyfikatora ikonę, można określić jako pierwszy parametr LoadFrame.

Wartości dla koloru tła i kursor dla MDIFrameWnd nie są używane, ponieważ obszaru klienckiego MDIFrameWnd jest całkowicie zakryty przez okno "MDICLIENT". Firma Microsoft nie będzie zachęcać tak instacji okna "MDICLIENT" Użyj kolory standardowe i typy kursora, gdy to możliwe.

Można utworzyć podklas formantów

Jeżeli użytkownik podklasy lub superklasy systemu Windows (na przykład CButton) następnie klasy automatycznie pobiera atrybuty WNDCLASS w realizacji systemu Windows tego formantu.

Funkcja AfxRegisterWndClass

MFC przewiduje rutynowych Pomocnik rejestrowania klasy okna. Biorąc pod uwagę zestaw atrybutów (styl klasowy okna, kursor, pędzla tła i ikona), syntetycznych nazwa jest generowana i wynikowe klasy okno 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. Zobacz Klasy Library Reference więcej szczegółów.

Ciąg zwracany jest tymczasowy wskaźnik do buforu ciągów statyczne, które jest ważne aż do następnego wywołanie AfxRegisterWndClass. Jeśli chcesz zachować ten ciąg wokół, przechowywać ją w zmiennej CString . Na przykład,

CStrin&g strWndClass = AfxRegisterWndClass (CS_DBLCLK,...);
...
CWnd * pWnd = new CWnd;
pWnd BT;Utwórz (strWndClass,...);

AfxRegisterWndClass wygeneruje CResourceException , jeśli klasy okna nie może zarejestrować (z powodu złych parametrów, lub o braku pamięci systemu Windows).

RegisterClass i funkcji AfxRegisterClass

Jeżeli chcesz zrobić nic bardziej zaawansowane niż przewiduje AfxRegisterWndClass , może wywołać Windows API RegisterClass lub funkcja MFC AfxRegisterClass. CWnd, CFrameWnd i CMDIChildWnd Tworzenie funkcji podjąć lpszClassName string nazwa klasy okno jako pierwszy parametr. Można dowolną nazwę klasy okna, niezależnie od tego, z jak został zarejestrowany.

Warto używać AfxRegisterClass (lub AfxRegisterWndClass) w bibliotece DLL dla platformy Win32. Win32 nie automatycznie wyrejestrowuje klas zarejestrowane przez bibliotekę DLL, należy to wyraźnie Jeśli biblioteka DLL jest zakończone. Przy użyciu AfxRegisterClass zamiast RegisterClass odbywa się to automatycznie dla Ciebie. AfxRegisterClass przechowuje listę unikatowy klas zarejestrowane przez biblioteki DLL i automatycznie będzie wyrejestrować następnie kiedy kończy się biblioteki DLL. Korzystając z RegisterClass w bibliotece DLL, musi ubezpieczenia, że wszystkie klasy są niezarejestrowanych, jeśli biblioteka DLL jest zakończony (w funkcji DllMain ). Niespełnienie tego może spowodować RegisterClass nieoczekiwane niepowodzenie, gdy biblioteka DLL jest używany przez inną aplikację klient.

Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii

Index