共用方式為


TN001: 視窗類別註冊

這個註解告訴您,註冊特殊的 MFC 常式 WNDCLASS是所需的 Microsoft Windows。 特定WNDCLASS討論 MFC 和 Windows 所使用的屬性。

問題

屬性的 CWnd 物件,像是HWND在 Windows 中處理,而會儲存在兩個地方: window 物件和WNDCLASS。 值為WNDCLASS如會傳遞至一般視窗建立函式CWnd::CreateCFrameWnd::Create在lpszClassName參數。

WNDCLASS必須先透過其中四個方式註冊:

WNDCLASS 欄位

WNDCLASS結構描述的視窗類別欄位所組成。 下表顯示的欄位,並指定 [MFC 應用程式的使用方式:

欄位

描述

lpfnWndProc

視窗程序,必須是AfxWndProc

cbClsExtra

未使用 (應該是零)

cbWndExtra

未使用 (應該是零)

hInstance

自動填滿AfxGetInstanceHandle

hIcon

框架視窗的圖示,請參閱以下

hCursor

資料指標,當滑鼠經過] 視窗中,請參閱下面的

hbrBackground

背景色彩,請參閱下方

lpszMenuName

未使用 (應該是空值)

lpszClassName

類別名稱,請參閱下方

提供 WNDCLASSes

較早版本的 MFC (之前 MFC 4.0),提供數個預先定義的視窗類別。 預設狀況下不會再提供這些視窗類別。 應用程式應使用AfxRegisterWndClass使用適當的參數。

如果應用程式會提供指定的資源識別碼 (例如,AFX_IDI_STD_FRAME) 的資源,MFC 會使用該資源。 否則,它會使用預設資源。 圖示,使用標準的應用程式圖示時,並用對於資料指標中,標準的箭號游標。

兩個圖示支援與單一文件類型的 MDI 應用程式: 主應用程式的一個圖示,圖示的文件 MDIChild windows 的其他圖示。 多重文件類型具有不同的圖示,您必須註冊其他WNDCLASSes 或使用CFrameWnd::LoadFrame函式。

CFrameWnd::LoadFrame將登錄WNDCLASS使用圖示的 ID 指定為第一個參數與下列標準的屬性:

  • 類別樣式: CS_DBLCLKS |CS_HREDRAW |CS_VREDRAW;

  • AFX_IDI_STD_FRAME 圖示

  • 箭號游標

  • COLOR_WINDOW 的背景色彩

背景色彩和資料指標,值 CMDIFrameWnd 後的工作區並不會使用CMDIFrameWnd完整涵蓋的 MDICLIENT 視窗。 Microsoft 不會不鼓勵子類別化 MDICLIENT 視窗,所以使用的標準色彩,請儘可能的資料指標型別。

子類別化和 Superclassing 控制項

如果您的子類別或超級類別的視窗控制 (例如, CButton) 會自動取得您的類別,然後WNDCLASS中視窗的實作該控制項所提供的屬性。

AfxRegisterWndClass 函式

MFC 提供註冊視窗類別的 helper 函式。 有了一組屬性 (視窗類別樣式、 游標、 背景的筆刷和圖示),就會產生綜合式的名稱,而且產生的視窗類別註冊。 例如:

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

這個函數會傳回暫存產生的已註冊的視窗類別名稱的字串。 如需有關這項功能的詳細資訊,請參閱AfxRegisterWndClass

傳回的字串是暫時的靜態字串緩衝區指標。 都有效,也至下次呼叫AfxRegisterWndClass。 如果您想要保留這個字串周圍,儲存在 CString 變數,如下例所示:

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

AfxRegisterWndClass將會擲回 CResourceException 如果該視窗類別註冊失敗 (因錯誤的參數,或 Windows 記憶體用完)。

RegisterClass 和 AfxRegisterClass 函式

如果您想要做的任何項目更精密比起AfxRegisterWndClass提供,您就可以呼叫 Windows API RegisterClass或 MFC 函式AfxRegisterClassCWndCFrameWndCMDIChildWndCreate函式都接受lpszClassName字串,代表視窗類別的第一個參數名稱。 您可以使用任何已註冊的視窗類別名稱,無論您用來註冊它的方法。

請務必使用AfxRegisterClass (或AfxRegisterWndClass) 上 Win32 DLL 中。 Win32 並不會自動解除登錄類別登錄的 dll,所以必須終止該 DLL 時明確地取消註冊類別。 藉由使用AfxRegisterClass而不是RegisterClass這會為您自動處理。 AfxRegisterClass維持的唯一的類別清單由您的 DLL 登錄與適當會自動地移除註冊時,DLL 會終止。 當您使用RegisterClass在 DLL 中,您必須確定 DLL 終止時,會取消登錄所有類別 (在您 DllMain 函式)。 若要執行這項操作失敗,可能會造成RegisterClass到另一個用戶端應用程式嘗試使用您的 DLL 意外失敗。

請參閱

其他資源

技術的備忘稿編號

依類別的技術注意事項