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::WindowProcCWindowImpl 的每个实例可以子类化其他窗口。

注意

对于任何给定的 CWindowImpl 对象,请调用 CreateSubclassWindow。 不要对同一对象调用两种方法。

除了 CWindowImpl,ATL 还提供 CContainedWindow 来创建包含在另一个对象中的窗口。

基类析构函数 (~ CWindowImplRoot) 可确保窗口在对象销毁之前消失。

CWindowImpl 派生自从 CWindowImplRoot 派生的 CWindowImplBaseT,后者派生自 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::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 以提供不同的消息处理机制。

另请参阅

BEGIN_MSG_MAP
CComControl 类
类概述