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
物件,呼叫 Create
或 SubclassWindow
。 不要對同一物件叫用兩種方法。
除了 CWindowImpl
,ATL 還提供 CContainedWindow 來建立包含在另一個 物件中的視窗。
基類解構函式 (~ CWindowImplRoot
) 可確保視窗在物件終結之前消失。
CWindowImpl
衍生自 CWindowImplBaseT
,其衍生自 CWindowImplRoot
,其衍生自 TBase
和 CMessageMap。
如需 | 請參閱 |
---|---|
建立控制項 | ATL 教學課程 |
在 ATL 中使用視窗 | ATL 視窗類別 |
ATL 專案精靈 | 建立 ATL 專案 |
繼承階層架構
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
衍生您的類別,並包含要覆寫 GetWndClassInfo
的DECLARE_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
以提供處理訊息的不同機制。