射到 CWnd对象。
还有一点与 MFC 的 CWnd 类不同的是当一个 CWindow 对象超出了作用域,它关联的窗口并不被销毁掉,这意味着你并不需要随时记得分离你所创建的临时 CWindow 对象。
在 ATL 类中对窗口过程的实现是 CWindowImpl。
CWindowImpl 含有所有窗口实现代码,例如:窗口类的注册,窗口的子类化,消息映射以及基本的 WindowProc函数,可以看出这与 MFC 的设计有很大的不同,MFC 将所有的代码都放在一个 CWnd 类中。
还有两个独立的类包含对话框的实现,它们分别是 CDialogImpl 和 CAxDialogImpl,CDialogImpl 用于实现普通的对话框而 CAxDialogImpl 实现含有 ActiveX 控件的对话框。
定义一个窗口的实现 任何非对话框窗口都是从 CWindowImpl 派生的,你的新类需要包含三件事情: 1. 一个窗口类的定义 2. 一个消息映射链 3. 窗口使用的默认窗口类型,称为 window traits 窗口类的定义通过 DECLARE_WND_CLASS 宏或 DECLARE_WND_CLASS_EX 宏来实现。
这辆个宏定义了一个 CWndClassInfo 结构,这个结构封装了 WNDCLASSEX 结构。
DECLARE_WND_CLASS 宏让你指定窗口类的类名,其他参数使用默认设置,而 DECLARE_WND_CLASS_EX 宏还允许你指定窗口类的类型和窗口的背景颜色,你也可以用 NULL 作为类名,ATL 会自动为你生成一个类名。
让我们开始定义一个新类,在后面的章节我会逐步的完成这个类的定义。
class CMyWindow : public CWindowImplltCMyWindowgt public: DECLARE_WND_CLASS_TquotMy Window Classquot 接下来是消息映射链,ATL 的消息映射链比 MFC 的简单的多,ATL 的消息映射链被展开为 switch 语句,switch 语句正确的消息处理者并调用相应的函数。
使用消息映射链的宏是 BEGIN_MSG_MAP 和END_MSG_MAP,让我们为我们的窗口添加一个空的消息映射链。
class CMyWindow : public CWindowImplltCMyWindowgt public: DECLARE_WND_CLASS_TquotMy Window Classquot BEGIN_MSG_MAPCMyWindow END_MSG_MAP 我将在下一节展开讲如何添加消息处理到消息映射链。
最后,我们需要为我们的窗口类定义窗口的特征,窗口的特征就是窗口类型和扩展窗口类型的联合体,用于创建窗口时指定窗口的类型。
窗口类型被指定为参数模板,所以窗口的调用者不需要为指定窗口的正确类型而烦心,下面是是同 ATL 类 CWinTraits定义窗口类型的例子: typedef CWinTraitsltWS_OVERLAPPEDWINDOW WS_CLIPCHILDRENWS_EX_APPWINDOWgtCMyWindowTraits class CMyWindow : public CWindowImplltCMyWindow CWindow CMyWindowTraitsgt public: DECLARE_WND_CLASS_TquotMy Window Classquot BEGIN_MSG_MAPCMyWindow END_MSG_MAP 调用者可以重载 CMyWindowTraits 的类型定义,但是一般情况下这是没有必要的,ATL 提供了几个预先定义的特殊的类型,其中之一就是 CFrameWinTraits,一个非常棒的框架窗口: typedef CWinTraitsltWS_OVERLAPPEDWINDOW WS_CLIPCHILDREN WS_CLIPSIBLINGS WS_EX_APPWINDOW WS_EX_WINDOWEDGEgtCFrameWinTraits 填写消息映射链 ATL 的消息映射链是对开发者不太友好的部分,也是 WTL 对其改进最大的部分。
类向导至少可以让你添加消息响应,然而 ATL 没有消息相关的宏和象 MFC 那样的参数自动展开功能,在 ATL 中只有三种类型的消息处理,一个是 WM_NOTIFY,一个是 WM_COMMAND,第三类是其他窗口消息,让我们开始为我们的窗口添加 WM_CLOSE 和 WM_DESTROY 的消息相应函数。
class CMyWindow : public CWindowImplltCMyWindow CWindow CFrameWinTraitsgt public: DECLARE_WND_CLASS_TquotMy Window Classquot BEGIN_MSG_MAPCMyWindow MESSAGE_HANDLERWM_CLOSE OnClose MESSAGE_HANDLERWM_DESTROY OnDestroy END_MSG_MAP LRESULT OnCloseUINT uMsg WPARAM wParam LPARAM lParam BOOLamp bHandled DestroyWindow return 0 LRESULT OnDestroyUINT uMsg WPARAM wParam LPARAM lParam BOOLamp bHandled PostQuitMessage0 return 0 你可能注意到消息响应函数的到的是原始的 WPARAM 和 LPARAM 值,你需要自己将其展开为相应的消息所需要的参数。
还有第四个参数 bHandled,这个参数在消息相应函数调用被 ATL 设置为 TRUE,如果在你的消息响应处理完之后需要 ATL 调用默认的 WindowProc处理该消息,你可以将 bHandled 设置为FALSE.
上一篇:
手把手教你做UG二次开发
下一篇:
英语论文网([网学网]):英语专业本科生毕业论文写作