Implementing a Window with CWindowImpl
若要實作 視窗中,從 CWindowImpl衍生一個類別。 在衍生類別中,宣告的訊息對應 (Message Map) 和訊息處理常式函式。 您可以用下列三種不同的方法可以使用您的類別:
建立以新的視窗類別的視窗
Superclass 現有視窗類別
子類別的現有 Windows
建立以新的視窗類別的視窗
CWindowImpl 包含 DECLARE_WND_CLASS 巨集會宣告視窗類別的資訊。 這個巨集實作 GetWndClassInfo 函式,使用 CWndClassInfo 定義新的視窗類別的相關資訊。 當 CWindowImpl::Create 呼叫時,這個視窗類別的登錄,並建立新的視窗。
注意事項 |
---|
CWindowImpl 傳遞至 NULLDECLARE_WND_CLASS 巨集,表示 ATL 會產生視窗類別名稱。若要指定您的名稱,請將字串傳遞至 CWindowImpl的 DECLARE_WND_CLASS 衍生類別。 |
範例
以下實作會根據新的視窗類別的視窗類別的範例:
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 執行個體會呼叫方法 建立 。
注意事項 |
---|
若要覆寫預設的視窗將訊息類別,請將 CWndClassInfo 成員執行在衍生類別中 GetWndClassInfo 方法為適當的值。 |
下列 Superclass 標準編譯類別與類別的範例:
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;
}
};
若要建立 Superclass 編輯視窗,請建立 CMyEdit 執行個體會呼叫方法 建立 。
設定 Superclass 現有視窗類別
DECLARE_WND_SUPERCLASS 巨集可讓您建立類別的 Superclass 現有視窗的視窗。 指定這個巨集會在您的 CWindowImpl衍生類別。 就像其他 ATL 視窗,訊息是訊息對應的處理。
當您使用 DECLARE_WND_SUPERCLASS,新的視窗類別會註冊。 這個新類別將與現有的類別以 CWindowImpl::WindowProc 指定,不過,取代視窗程序的相同 (或以覆寫這個方法) 的函式。
子類別化現有視窗
若要子類別化現有的視窗中,從 CWindowImpl 衍生類別並宣告的訊息對應,在兩個上述情況。 不過,請注意,如果您沒有指定任何視窗類別資訊,,因為您將子類別現有視窗。
而不是呼叫 建立,呼叫 SubclassWindow 再將控制代碼傳遞至您要為子類別的現有視窗中。 一旦視窗為子類別,則會使用 CWindowImpl::WindowProc (或覆寫這個方法) 的函式用來導向訊息至訊息對應。 若要中斷連結您的物件的子類別化視窗,請呼叫 UnsubclassWindow。 視窗的原始視窗程序就會還原。