TN001: rejestracja klas okienTN001: Window Class Registration

Ta Uwaga opisuje procedury MFC, które rejestrują specjalne WNDCLASSy, które są niezbędne w systemie Microsoft Windows.This note describes the MFC routines that register the special WNDCLASSes needed by Microsoft Windows. WNDCLASSOmówione są określone atrybuty używane przez MFC i Windows.Specific WNDCLASS attributes used by MFC and Windows are discussed.

ProblemThe Problem

Atrybuty obiektu CWnd , takie jak HWND uchwyt w systemie Windows, są przechowywane w dwóch miejscach: obiekt window i WNDCLASS .The attributes of a CWnd object, like an HWND handle in Windows, are stored in two places: the window object and the WNDCLASS. Nazwa WNDCLASS jest przenoszona do ogólnych funkcji tworzenia okna, takich jak CWnd:: Create i obiektu CFrameWnd:: Create w parametrze lpszClassName .The name of the WNDCLASS is passed to general window creation functions such as CWnd::Create and CFrameWnd::Create in the lpszClassName parameter.

Ta WNDCLASS Metoda musi być zarejestrowana w jednym z czterech:This WNDCLASS must be registered through one of four means:

  • Niejawnie przy użyciu dostarczonej biblioteki MFC WNDCLASS .Implicitly by using a MFC provided WNDCLASS.

  • Niejawnie przez podklasy kontrolki systemu Windows (lub innej kontrolki).Implicitly by subclassing a Windows control (or some other control).

  • Jawnie przez wywołanie MFC AfxRegisterWndClass — lub AfxRegisterClass.Explicitly by calling the MFC AfxRegisterWndClass or AfxRegisterClass.

  • Jawnie przez wywołanie procedury systemu Windows RegisterClass.Explicitly by calling the Windows routine RegisterClass.

Pola WNDCLASSWNDCLASS Fields

WNDCLASSStruktura składa się z różnych pól, które opisują klasę okna.The WNDCLASS structure consists of various fields that describe a window class. W poniższej tabeli przedstawiono pola i sposób ich użycia w aplikacji MFC:The following table shows the fields and specifies how they are used in an MFC application:

PoleField OpisDescription
lpfnWndProclpfnWndProc proces okna musi być AfxWndProcwindow proc, must be an AfxWndProc
cbClsExtracbClsExtra nieużywane (wartość powinna być równa zero)not used (should be zero)
cbWndExtracbWndExtra nieużywane (wartość powinna być równa zero)not used (should be zero)
hInstancehInstance automatycznie wypełnione AfxGetInstanceHandleautomatically filled with AfxGetInstanceHandle
hIconhIcon ikona dla okien ramowych, patrz poniżejicon for frame windows, see below
hCursorhCursor kursor, gdy wskaźnik myszy znajduje się nad oknem, patrz poniżejcursor for when mouse is over window, see below
hbrBackgroundhbrBackground kolor tła, zobacz poniżejbackground color, see below
lpszMenuNamelpszMenuName nieużywane (powinno mieć wartość NULL)not used (should be NULL)
lpszClassNamelpszClassName Nazwa klasy, zobacz poniżej.class name, see below

Podano WNDCLASSesProvided WNDCLASSes

Starsze wersje MFC (przed MFC 4,0), dostarczyły kilka wstępnie zdefiniowanych klas okien.Earlier versions of MFC (before MFC 4.0), provided several predefined Window classes. Te klasy okien nie są już domyślnie udostępniane.These Window classes are no longer provided by default. Aplikacje powinny być używane AfxRegisterWndClass z odpowiednimi parametrami.Applications should use AfxRegisterWndClass with the appropriate parameters.

Jeśli aplikacja udostępnia zasób o określonym IDENTYFIKATORze zasobu (na przykład AFX_IDI_STD_FRAME), MFC będzie używać tego zasobu.If the application provides a resource with the specified resource ID (for example, AFX_IDI_STD_FRAME), MFC will use that resource. W przeciwnym razie użyje zasobu domyślnego.Otherwise it will use the default resource. W przypadku ikony zostanie użyta ikona standardowej aplikacji, a dla kursora zostanie użyty standardowy kursor strzałek.For the icon, the standard application icon is used, and for the cursor, the standard arrow cursor is used.

Dwie ikony obsługują aplikacje MDI o pojedynczym typie dokumentu: jedną ikonę dla aplikacji głównej, drugą ikonę dla okna Dokument z ikonami/MDIChild.Two icons support MDI applications with single document types: one icon for the main application, the other icon for iconic document/MDIChild windows. Dla wielu typów dokumentów z różnymi ikonami należy zarejestrować dodatkowe WNDCLASS es lub użyć funkcji obiektu CFrameWnd:: LoadFrame .For multiple document types with different icons, you must register additional WNDCLASSes or use the CFrameWnd::LoadFrame function.

CFrameWnd::LoadFrame spowoduje zarejestrowanie się WNDCLASS przy użyciu identyfikatora ikony, który jest określany jako pierwszy parametr i następujące atrybuty standardowe:CFrameWnd::LoadFrame will register a WNDCLASS using the icon ID you specify as the first parameter and the following standard attributes:

  • styl klasy: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;class style : CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

  • AFX_IDI_STD_FRAME ikonyicon AFX_IDI_STD_FRAME

  • kursor strzałkiarrow cursor

  • Kolor tła COLOR_WINDOWCOLOR_WINDOW background color

Wartości koloru tła i kursora dla CMDIFrameWnd nie są używane, ponieważ obszar klienta CMDIFrameWnd jest całkowicie objęty oknem MDICLIENT .The values for background color and cursor for the CMDIFrameWnd are not used since the client area of the CMDIFrameWnd is completely covered by the MDICLIENT window. Firma Microsoft nie zachęca do podklasy okna MDICLIENT , więc używaj standardowych kolorów i typów kursorów, gdy jest to możliwe.Microsoft does not encourage subclassing the MDICLIENT window so use the standard colors and cursor types when possible.

Podklasy i kontrolki superklasySubclassing and Superclassing Controls

Jeśli podklasa lub Superklasa jest formantem systemu Windows (na przykład CButton), Klasa automatycznie pobiera WNDCLASS atrybuty podane w implementacji systemu Windows.If you subclass or superclass a Windows control (for example, CButton) then your class automatically gets the WNDCLASS attributes provided in the Windows implementation of that control.

Funkcja AfxRegisterWndClass —The AfxRegisterWndClass Function

MFC udostępnia funkcję pomocnika do rejestracji klasy okna.MFC provides a helper function for registering a window class. Po otrzymaniu zestawu atrybutów (stylu klasy okna, kursora, pędzla tła i ikony) jest generowana nazwa syntetyczna, a powstała Klasa okna jest zarejestrowana.Given a set of attributes (window class style, cursor, background brush, and icon), a synthetic name is generated, and the resulting window class is registered. Przykład:For example,

const char* AfxRegisterWndClass(UINT nClassStyle,
    HCURSOR hCursor,
    HBRUSH hbrBackground,
    HICON hIcon);

Ta funkcja zwraca tymczasowy ciąg wygenerowanej nazwy klasy okna zarejestrowanej.This function returns a temporary string of the generated registered window class name. Aby uzyskać więcej informacji na temat tej funkcji, zobacz AfxRegisterWndClass —.For more information about this function, see AfxRegisterWndClass.

Zwrócony ciąg jest tymczasowym wskaźnikiem do statycznego buforu ciągu.The returned string is a temporary pointer to a static string buffer. Jest on ważny do momentu następnego wywołania do AfxRegisterWndClass .It is valid until the next call to AfxRegisterWndClass. Jeśli chcesz zachować ten ciąg, Zapisz go w zmiennej CString , jak w poniższym przykładzie:If you want to keep this string around, store it in a CString variable, as in this example:

CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);

...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);

...

AfxRegisterWndClass wygeneruje CResourceException , jeśli nie można zarejestrować klasy okna (z powodu nieprawidłowych parametrów lub z pamięci systemu Windows).AfxRegisterWndClass will throw a CResourceException if the window class failed to register (either because of bad parameters, or out of Windows memory).

Funkcje RegisterClass i AfxRegisterClassThe RegisterClass and AfxRegisterClass Functions

Jeśli chcesz zrobić coś bardziej, niż to możliwe AfxRegisterWndClass , możesz wywołać interfejs API systemu Windows RegisterClass lub funkcję MFC AfxRegisterClass .If you want to do anything more sophisticated than what AfxRegisterWndClass provides, you can call the Windows API RegisterClass or the MFC function AfxRegisterClass. CWndFunkcje, obiektu CFrameWnd i CMDIChildWnd Create przyjmują nazwę ciągu lpszClassName dla klasy Window jako pierwszy parametr.The CWnd, CFrameWnd and CMDIChildWnd Create functions take a lpszClassName string name for the window class as the first parameter. Możesz użyć dowolnej nazwy klasy okna, niezależnie od metody użytej do zarejestrowania.You can use any registered window class name, regardless of the method you used to register it.

Ważne jest użycie AfxRegisterClass (lub AfxRegisterWndClass ) w bibliotece DLL w systemie Win32.It is important to use AfxRegisterClass (or AfxRegisterWndClass) in a DLL on Win32. Win32 nie wyrejestruje automatycznie klas zarejestrowanych przez bibliotekę DLL, więc musisz jawnie wyrejestrować klasy, gdy biblioteka DLL zostanie przerwana.Win32 does not automatically unregister classes registered by a DLL, so you must explicitly unregister classes when the DLL is terminated. Użycie AfxRegisterClass zamiast RegisterClass tego jest obsługiwane automatycznie.By using AfxRegisterClass instead of RegisterClass this is handled automatically for you. AfxRegisterClass zachowuje listę unikatowych klas zarejestrowanych przez bibliotekę DLL i automatycznie wyrejestrowuje je po zakończeniu działania biblioteki DLL.AfxRegisterClass maintains a list of unique classes registered by your DLL and will automatically unregister them when the DLL terminates. W przypadku korzystania RegisterClass z programu w bibliotece DLL, należy się upewnić, że wszystkie klasy są wyrejestrowane, gdy biblioteka DLL zostanie zakończona (w funkcji DllMain ).When you use RegisterClass in a DLL, you must ensure that all classes are unregistered when the DLL is terminated (in your DllMain function). Niewykonanie tej czynności może spowodować RegisterClass nieoczekiwane niepowodzenie, gdy inna aplikacja kliencka próbuje użyć biblioteki DLL.Failure to do so might cause RegisterClass to fail unexpectedly when another client application tries to use your DLL.

Zobacz teżSee also

Uwagi techniczne według numeruTechnical Notes by Number
Uwagi techniczne według kategoriiTechnical Notes by Category