若要实现窗口,请从 CWindowImpl 派生类。在派生类中声明消息映射和消息处理函数。现在可以以三种不同的方式使用类: 基于新 Windows 类创建窗口CWindowImpl 包含声明 Windows 类消息的 DECLARE_WND_CLASS 宏。该宏实现 GetWndClassInfo 函数,此函数使用 CWndClassInfo 定义新 Windows 类的信息。调用 CWindowImpl::Create 时,会注册此 Windows 类并创建一个新窗口。 注意 CWindowImpl 将 NULL 传递给 DECLARE_WND_CLASS 宏,这意味着 ATL 将生成一个 Windows 类名。若要指定自己的名称,请在 CWindowImpl 派生类中将字符串传递给 DECLARE_WND_CLASS。 示例下面是基于新 Windows 类实现窗口的类示例: class CMyWindow : public CWindowImpl<CMyWindow>, ... { public: // Optionally specify name of the new Windows class DECLARE_WND_CLASS("MyName") // If this macro is not specified in your // class, ATL will generate a class name ... BEGIN_MSG_MAP(CMyWindow) MESSAGE_HANDLER(WM_PAINT, OnPaint) END_MSG_MAP() LRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // Do some painting code return 0; } }; 若要创建窗口,请创建一个 注意 若要重写默认的 Windows 类信息,请通过将 CWndClassInfo 成员设置为适当的值,在派生类中实现 GetWndClassInfo 方法。 为现有 Windows 类创建超类DECLARE_WND_SUPERCLASS 宏允许创建为现有 Windows 类创建超类的窗口。在 CWindowImpl 派生类中指定此宏。像任何其他 ATL 窗口一样,消息由消息映射处理。 使用 DECLARE_WND_SUPERCLASS 时将注册一个新 Windows 类。这个新类与指定的现有类相同,但是将用 CWindowImpl::WindowProc(或重写此方法的函数)替换窗口过程。 示例下面是为标准 Edit 类创建超类的类示例: 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("MyEdit", "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 } }; 若要创建具有超类的“编辑”窗口,请创建 为现有窗口创建子类若要为现有窗口创建子类,请从 CWindowImpl 派生类,并声明消息映射(像前面两种情况中那样)。不过请注意,不要指定任何 Windows 类信息,因为将为现有窗口创建子类。 不是调用 Create,而是调用 SubclassWindow,并向它传递要为其创建子类的现有窗口的句柄。为窗口创建子类后,它将使用 CWindowImpl::WindowProc(或重写此方法的函数)将消息定向到消息映射。若要从对象中分离具有子类的窗口,请调用 UnsubclassWindow。窗口的原始窗口过程于是将还原。 请参见
添加 ATL 消息处理程序
若要向控件添加消息处理程序(处理 Windows 消息的成员函数),首先在“类视图”中选择控件。然后打开“属性”窗口,选择“消息”图标,接着在对应所需消息的框中单击下拉 (Dropdown) 控件。这将在控件的头文件中添加消息处理程序的声明,在控件的 .cpp 文件中添加处理程序的主干实现。它还将添加消息映射并为处理程序添加一项。 在 ATL 中添加消息处理程序类似于向 MFC 类添加消息处理程序。有关更多信息,请参见添加 MFC 消息处理程序。 下列条件仅适用于添加 ATL 消息处理程序:
消息处理函数
ATL 提供三种类型的消息处理函数:
本主题描述消息处理函数的语法。 MessageHandler参数
返回值消息处理的结果。如果成功,则为 0。 备注MessageHandler 是消息映射中由 MESSAGE_HANDLER 宏的第二个参数标识的函数的名称。 有关在消息映射中使用此消息处理程序的示例,请参见 MESSAGE_HANDLER。 CommandHandler参数
返回值消息处理的结果。如果成功,则为 0。 备注CommandHandler 是消息映射中由 COMMAND_HANDLER 宏的第三个参数标识的函数的名称。 有关在消息映射中使用此消息处理程序的示例,请参见 COMMAND_HANDLER。 NotifyHandler参数
返回值消息处理的结果。如果成功,则为 0。 备注NotifyHandler 是消息映射中由 NOTIFY_HANDLER 宏的第三个参数标识的函数的名称。 有关在消息映射中使用此消息处理程序的示例,请参见 NOTIFY_HANDLER。 请参见 |
ATL中显示窗口
最新推荐文章于 2022-03-23 12:40:28 发布
使用 CWindowImpl 实现窗口
2010-05-20 09:10