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
派生自从 CWindowImplRoot
派生的 CWindowImplBaseT
,后者派生自 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::DefWindowProc
由 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
派生您的类并包含 DECLARE_WND_SUPERCLASS 宏以替代 GetWndClassInfo
。 有关详细信息,请参阅 CWindowImpl 概述。
除了使用 DECLARE_WND_CLASS 和 DECLARE_WND_SUPERCLASS 宏外,还可以使用自己的实现替代 GetWndClassInfo
。
CWindowImpl::m_pfnSuperWindowProc
根据窗口,指向以下窗口过程之一。
WNDPROC m_pfnSuperWindowProc;
注解
窗口类型 | 窗口过程 |
---|---|
基于通过 DECLARE_WND_CLASS 宏指定的新窗口类的窗口。 | DefWindowProc Win32 函数。 |
基于通过 DECLARE_WND_SUPERCLASS 宏指定的、修改现有类的窗口类的窗口。 | 现有窗口类的窗口过程。 |
子类化窗口。 | 子类化窗口的原始窗口过程。 |
CWindowImpl::DefWindowProc 将消息信息发送到保存在 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
以提供不同的消息处理机制。