共用方式為


CWindowImpl 類別

提供建立或子類別化視窗的方法。

重要

這個類別及其成員不能用於在 Windows 執行階段 中執行的應用程式。

語法

template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT<TBase, TWinTraits>

參數

T
您的新類別,衍生自 CWindowImpl

TBase
您類別的基底類別。 根據預設,基類為 CWindow

TWinTraits
定義 視窗樣式的特性類別 。 預設值為 CControlWinTraits

成員

公用方法

名稱 描述
CWindowImpl::Create 建立視窗。

CWindowImplBaseT 方法

名稱 描述
DefWindowProc 提供預設訊息處理。
GetCurrentMessage 傳回目前訊息。
GetWindowProc 傳回目前的視窗程序。
OnFinalMessage 在收到最後一則訊息之後呼叫 (通常是WM_NCDESTROY)。
SubclassWindow 子類別化視窗。
UnsubclassWindow 還原先前子類別化的視窗。

靜態方法

名稱 描述
GetWndClassInfo 傳回 CWndClassInfo靜態實例,其會管理視窗類別資訊。
WindowProc 處理傳送至視窗的訊息。

資料成員

名稱 描述
m_pfnSuperWindowProc 指向視窗類別的原始視窗程序。

備註

您可以使用 CWindowImpl 建立視窗或子類別現有的視窗。 CWindowImpl視窗程式會使用訊息對應將訊息導向至適當的處理程式。

CWindowImpl::Create根據 CWndClassInfo管理的視窗類別資訊,建立視窗。 CWindowImpl 包含 DECLARE_WND_CLASS 巨集,這表示 CWndClassInfo 註冊新的窗口類別。 如果您想要將現有的視窗類別超類別,請從 CWindowImpl 衍生您的類別,並包含 DECLARE_WND_SUPERCLASS 巨集。 在這種情況下,CWndClassInfo 會依據現有的類別註冊視窗類別,但是會使用 CWindowImpl::WindowProc。 例如:

class ATL_NO_VTABLE CMyWindow :
   OtherInheritedClasses
   public CComControl<CMyWindow>
          // CComControl derives from CWindowImpl
{
public:
   // 1. The NULL parameter means ATL will generate a
   //    name for the superclass
   // 2. The "EDIT" parameter means the superclass is
   //    based on the standard Windows Edit box
   DECLARE_WND_SUPERCLASS(NULL, _T("EDIT"))

   // Remainder of class declaration omitted

注意

由於 CWndClassInfo 只會管理一個視窗類別的資訊,因此每個透過 CWindowImpl 執行個體所建立的視窗都是以相同的視窗類別為基礎。

CWindowImpl 也支援視窗子類別化。 SubclassWindow 方法會將現有視窗附加至 CWindowImpl 物件,並將視窗程序變更至 CWindowImpl::WindowProc。 每個 CWindowImpl 執行個體都可以子類別化為不同的視窗。

注意

針對任何指定的 CWindowImpl 物件,呼叫 CreateSubclassWindow。 不要對同一物件叫用兩種方法。

除了 CWindowImpl,ATL 還提供 CContainedWindow 來建立包含在另一個 物件中的視窗。

基類解構函式 (~ CWindowImplRoot) 可確保視窗在物件終結之前消失。

CWindowImpl 衍生自 CWindowImplBaseT,其衍生自 CWindowImplRoot,其衍生自 TBaseCMessageMap

如需 請參閱
建立控制項 ATL 教學課程
在 ATL 中使用視窗 ATL 視窗類別
ATL 專案精靈 建立 ATL 專案

繼承階層架構

CMessageMap

TBase

CWindowImplRoot

CWindowImplBaseT

CWindowImpl

需求

標頭: atlwin.h

CWindowImpl::Create

根據新的視窗類別建立視窗。

HWND Create(
    HWND hWndParent,
    _U_RECT rect = NULL,
    LPCTSTR szWindowName = NULL,
    DWORD dwStyle = 0,
    DWORD dwExStyle = 0,
    _U_MENUorID MenuOrID = 0U,
    LPVOID lpCreateParam = NULL);

參數

hWndParent
[in]父視窗或擁有者視窗的句柄。

rect
[in] 指定視窗位置的 RECT 結構。 RECT可以透過指標或傳址方式傳遞 。

szWindowName
[in]指定視窗的名稱。 預設值是 NULL。

dwStyle
[in]窗口的樣式。 此值會與視窗特性類別所提供的樣式結合。 預設值會提供對樣式的完整控制特性類別。 如需可能值的清單,請參閱 Windows SDK 中的 CreateWindow

dwExStyle
[in]延伸窗口樣式。 此值會與視窗特性類別所提供的樣式結合。 預設值會提供對樣式的完整控制特性類別。 如需可能值的清單,請參閱 Windows SDK 中的 CreateWindowEx

MenuOrID
[in]如果是子視窗,則為視窗標識符。 針對最上層視窗,視窗的功能表句柄。 預設值為 0U

lpCreateParam
[in]視窗建立數據的指標。 如需完整描述,請參閱 CreateWindowEx 的最終參數描述。

傳回值

如果成功,新建立視窗的句柄。 否則為 NULL。

備註

Create 如果尚未註冊,請先註冊窗口類別。 新建立的視窗會自動附加至 CWindowImpl 物件。

注意

如果您已經呼叫 SubclassWindow,請勿呼叫 。Create

若要使用以現有視窗類別為基礎的窗口類別,請從 CWindowImpl 衍生您的類別,並包含 DECLARE_WND_SUPERCLASS 巨集。 現有的視窗類別視窗程式會儲存在 m_pfnSuperWindowProc中。 如需詳細資訊,請參閱 CWindowImpl 概觀。

注意

如果使用 0 作為 MenuOrID 參數的值,則必須將它指定為 0U(預設值),以避免編譯程式錯誤。

CWindowImpl::D efWindowProc

WindowProc 呼叫以處理訊息對應未處理的訊息。

LRESULT DefWindowProc(
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam);

LRESULT DefWindowProc();

參數

uMsg
[in]傳送至視窗的訊息。

wParam
[in]其他訊息特定資訊。

lParam
[in]其他訊息特定資訊。

傳回值

訊息處理的結果。

備註

根據預設,DefWindowProc呼叫 CallWindowProc Win32 函式,將訊息資訊傳送至m_pfnSuperWindowProc中指定的視窗程式。

沒有參數的函式會自動從目前的訊息擷取所需的參數。

CWindowImpl::GetCurrentMessage

傳回封裝在結構中的 MSG 目前訊息。

const MSG* GetCurrentMessage();

傳回值

目前的訊息。

CWindowImpl::GetWindowProc

WindowProc傳回 ,目前的視窗程式。

virtual WNDPROC GetWindowProc();

傳回值

目前的視窗程式。

備註

覆寫此方法,以您自己的方式取代窗口程式。

CWindowImpl::GetWndClassInfo

Create 呼叫以存取視窗類別資訊。

static CWndClassInfo& GetWndClassInfo();

傳回值

CWndClassInfo靜態實例。

備註

根據預設, CWindowImpl 會透過 DECLARE_WND_CLASS 巨集取得這個方法,這個巨集會指定新的窗口類別。

若要將現有的視窗類別超類別,請從 CWindowImpl 衍生您的類別,並包含要覆寫 GetWndClassInfoDECLARE_WND_SUPERCLASS巨集。 如需詳細資訊,請參閱 CWindowImpl 概觀。

除了使用DECLARE_WND_CLASS和DECLARE_WND_SUPERCLASS巨集之外,您還可以使用自己的實作覆寫 GetWndClassInfo

CWindowImpl::m_pfnSuperWindowProc

視視窗而定,指向下列其中一個窗口程式。

WNDPROC m_pfnSuperWindowProc;

備註

窗口類型 視窗程式
以新視窗類別為基礎的視窗,透過 DECLARE_WND_CLASS 巨集指定。 DefWindowProc Win32 函式。
根據修改現有類別的視窗類別,透過 DECLARE_WND_SUPERCLASS 巨集指定的視窗。 現有窗口類別的視窗程式。
子類別化視窗。 子類別化視窗的原始視窗程式。

CWindowImpl::D efWindowProc 會將訊息資訊傳送至儲存在 中的 m_pfnSuperWindowProc視窗程式。

CWindowImpl::OnFinalMessage

在收到最後一則訊息之後呼叫 (通常是WM_NCDESTROY)。

virtual void OnFinalMessage(HWND hWnd);

參數

hWnd
[in]正在終結之視窗的句柄。

備註

的預設實 OnFinalMessage 作不會執行任何動作,但您可以覆寫此函式來處理清除,再終結視窗。 如果您要在視窗解構時自動刪除物件,您可以在此函式中呼叫 delete this;

CWindowImpl::SubclassWindow

子類別化 hWnd識別的視窗,並將它附加至 CWindowImpl 物件。

BOOL SubclassWindow(HWND hWnd);

參數

hWnd
[in]要子類別化之視窗的句柄。

傳回值

如果視窗已成功子類別化,則為TRUE;否則為 FALSE。

備註

子類別化視窗現在使用 CWindowImpl::WindowProc。 原始視窗程式會儲存在 m_pfnSuperWindowProc中。

注意

如果您已經呼叫 Create,請勿呼叫 。SubclassWindow

CWindowImpl::UnsubclassWindow

將子類別化視窗與 CWindowImpl 物件中斷連結,並還原儲存在 m_pfnSuperWindowProc的原始視窗程式。

HWND UnsubclassWindow();

傳回值

先前子類別化之視窗的句柄。

CWindowImpl::WindowProc

這個靜態函式會實作窗口程式。

static LRESULT CALLBACK WindowProc(
    HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam);

參數

hWnd
[in]視窗的句柄。

uMsg
[in]傳送至視窗的訊息。

wParam
[in]其他訊息特定資訊。

lParam
[in]其他訊息特定資訊。

傳回值

訊息處理的結果。

備註

WindowProc 會使用預設訊息對應(以 BEGIN_MSG_MAP 宣告)將訊息導向適當的處理程式。 如有必要, WindowProc 請呼叫 DefWindowProc 以處理其他訊息。 如果未處理最終訊息, WindowProc 請執行下列動作:

  • 如果視窗未分類,則執行取消訂閱。

  • 清除 m_hWnd

  • 在窗口終結之前呼叫 OnFinalMessage

您可以覆寫 WindowProc 以提供處理訊息的不同機制。

另請參閱

BEGIN_MSG_MAP
CComControl 類別
類別概觀