共用方式為


實作具有 CWindowImpl 的視窗

若要實作 視窗中,從 CWindowImpl衍生一個類別。 在衍生類別中,宣告的訊息對應 (Message Map) 和訊息處理常式函式。 您可以用下列三種不同的方法可以使用您的類別:

  • 建立以新的視窗類別的視窗

  • Superclass 現有視窗類別

  • 子類別的現有 Windows

建立以新的視窗類別的視窗

CWindowImpl 包含 DECLARE_WND_CLASS 巨集會宣告視窗類別的資訊。 這個巨集實作 GetWndClassInfo 函式,使用 CWndClassInfo 定義新的視窗類別的相關資訊。 當 CWindowImpl::Create 呼叫時,這個視窗類別的登錄,並建立新的視窗。

注意事項注意事項

CWindowImpl 傳遞至 NULLDECLARE_WND_CLASS 巨集,表示 ATL 會產生視窗類別名稱。若要指定您的名稱,請將字串傳遞至 CWindowImplDECLARE_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。 視窗的原始視窗程序就會還原。

請參閱

參考

實作視窗