使用 CWindowImpl 實作視窗
若要實作視窗,請從 CWindowImpl
衍生類別。 在您的衍生類別中,宣告訊息對應和訊息處理常式函式。 您現在可以以三種不同的方式使用類別:
根據新的 Windows 類別建立視窗
CWindowImpl
包含 宣告 Windows 類別資訊的DECLARE_WND_CLASS 宏。 這個宏會實作 函 GetWndClassInfo
式,該函式會使用 CWndClassInfo 來定義新 Windows 類別的資訊。 呼叫 時 CWindowImpl::Create
,會註冊此 Windows 類別,並建立新的視窗。
注意
CWindowImpl
將 Null 傳遞至 DECLARE_WND_CLASS
宏,這表示 ATL 會產生 Windows 類別名稱。 若要指定您自己的名稱,請將字串傳遞至衍生類別中的 CWindowImpl
DECLARE_WND_CLASS。
範例:實作視窗
以下是根據新 Windows 類別實作視窗的類別範例:
class CMyCustomWnd : public CWindowImpl<CMyCustomWnd>
{
public:
// Optionally specify name of the new Windows class
DECLARE_WND_CLASS(_T("MyName"))
// If this macro is not specified in your
// class, ATL will generate a class name
BEGIN_MSG_MAP(CMyCustomWnd)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
END_MSG_MAP()
LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
// Do some painting code
return 0;
}
};
若要建立視窗,請建立 的 CMyWindow
實例,然後呼叫 Create
方法。
注意
若要覆寫預設的 Windows 類別資訊,請將成員設定 CWndClassInfo
為適當的值,以在衍生類別中實 GetWndClassInfo
作 方法。
將現有的 Windows 類別超類別化
DECLARE_WND_SUPERCLASS 宏可讓您建立將現有 Windows 類別超類別化的視窗。 在 CWindowImpl
衍生類別中指定這個宏。 如同任何其他 ATL 視窗,訊息會由訊息對應處理。
當您使用DECLARE_WND_SUPERCLASS時,將會註冊新的 Windows 類別。 這個新類別會與您指定的現有類別相同,但會將視窗程式取代為 CWindowImpl::WindowProc
(或使用覆寫此方法的函式)。
範例:Edit 類別的 Superclass
以下是將標準 Edit 類別超類別化的類別範例:
class CMyEdit : public CWindowImpl<CMyEdit>
{
public:
// "Edit" is the name of the standard Windows class.
// "MyEdit" is the name of the new Windows class
// that will be based on the Edit class.
DECLARE_WND_SUPERCLASS(_T("MyEdit"), _T("Edit"))
BEGIN_MSG_MAP(CMyEdit)
MESSAGE_HANDLER(WM_CHAR, OnChar)
END_MSG_MAP()
LRESULT OnChar(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
// Do some character handling code
return 0;
}
};
若要建立超類別的 [編輯] 視窗,請建立 的 CMyEdit
實例,然後呼叫 Create
方法。
子類別化現有的視窗
若要將現有視窗子類別化,請從 CWindowImpl
衍生類別,並宣告訊息對應,如前兩個案例所示。 不過請注意,您並未指定任何 Windows 類別資訊,因為您會將已經存在的視窗子類別化。
不要呼叫 Create
,而是呼叫 SubclassWindow
,並將控制碼傳遞給您想要子類別的現有視窗。 子類別化視窗之後,它會使用 CWindowImpl::WindowProc
(或覆寫此方法的函式) 將訊息導向至訊息對應。 若要將子類別化視窗與物件中斷連結,請呼叫 UnsubclassWindow
。 然後,將會還原視窗的原始視窗程式。