共用方式為


使用 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 。 然後,將會還原視窗的原始視窗程式。

另請參閱

實作視窗