深入剖析WTL—WTL框架窗口分析(6)
2004-12-01 17:49
621 查看
WTL对框架窗口的封装
ATL仅仅是封装了窗口函数和提供了消息映射。实际应用中,需要各种种类的窗口,比如,每个界面线程所对应的框架窗口。WTL正是在ATL基础上,为我们提供了框架窗口和其他各种窗口。
所有的应用程序类型中,每个界面线程都有一个框架窗口(Frame)和一个视(View)。它们的概念和MFC中的一样。
图示是WTL的窗口类的继承图。
WTL框架窗口为我们提供了:
一个应用程序的标题,窗口框架,菜单,工具栏。
视的管理,包括视的大小的改变,以便与框架窗口同步。
提供对菜单,工具栏等的处理代码。
在状态栏显示帮助信息等等。
WTL视通常就是应用程序的客户区。它通常用于呈现内容给客户。
WTL提供的方法是在界面线程的逻辑中创建框架窗口,而视的创建由框架窗口负责。后面会介绍,框架窗口在处理WM_CREATE消息时创建视。
如果要创建一个框架窗口,需要:
从CFrameWindowImpl类派生你的框架窗口。
加入DECLARE_FRAME_WND_CLASS,指定菜单和工具栏的资源ID。
加入消息映射,同时把它与基类的消息映射联系起来。同时,加入消息处理函数。
下面是使用ATL/WTL App Wizard创建一个SDI应用程序的主框架窗口的申明。
DECLARE_FRAME_WND_CLASS()宏是为框架窗口指定一个资源ID,可以通过这个ID和应用程序的资源联系起来,比如框架的图标,字符串表,菜单和工具栏等等。
WTL视
通常应用程序的显示区域分成两个部分。一是包含窗口标题,菜单,工具栏和状态栏的主框架窗口。另一部分就是被称为视的部分。这部分是客户区,用于呈现内容给客户。
视可以是包含HWND的任何东西。通过在框架窗口处理WM_CREATE时,将该HWND句柄赋植给主窗口的m_hWndClien成员来设置主窗口的视。
比如,在用ATL/WTL App Wizard创建了一个应用程序,会创建一个视,代码如下:
这个视是一个从CWindowImpl派生的窗口。
在主窗口的创建函数中,将该视的HWND设置给主窗口的m_hWndClient成员。
上述代码为主窗口创建了视。
到此为止,我们已经从Win32模型开始,到了解windows界面程序封装以及WTL消息循环机制,详细分析了WTL。通过我们的分析,您是否对WTL有一个深入的理解,并能得心应手的开发出高质量的Windows应用程序?别急,随后,我们还将一起探讨开发WTL应用程序的技巧。
ATL仅仅是封装了窗口函数和提供了消息映射。实际应用中,需要各种种类的窗口,比如,每个界面线程所对应的框架窗口。WTL正是在ATL基础上,为我们提供了框架窗口和其他各种窗口。
所有的应用程序类型中,每个界面线程都有一个框架窗口(Frame)和一个视(View)。它们的概念和MFC中的一样。
图示是WTL的窗口类的继承图。
WTL框架窗口为我们提供了:
一个应用程序的标题,窗口框架,菜单,工具栏。
视的管理,包括视的大小的改变,以便与框架窗口同步。
提供对菜单,工具栏等的处理代码。
在状态栏显示帮助信息等等。
WTL视通常就是应用程序的客户区。它通常用于呈现内容给客户。
WTL提供的方法是在界面线程的逻辑中创建框架窗口,而视的创建由框架窗口负责。后面会介绍,框架窗口在处理WM_CREATE消息时创建视。
如果要创建一个框架窗口,需要:
从CFrameWindowImpl类派生你的框架窗口。
加入DECLARE_FRAME_WND_CLASS,指定菜单和工具栏的资源ID。
加入消息映射,同时把它与基类的消息映射联系起来。同时,加入消息处理函数。
下面是使用ATL/WTL App Wizard创建一个SDI应用程序的主框架窗口的申明。
class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>, public CMessageFilter, public CIdleHandler { public: DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME) // 该框架窗口的视的实例 CView m_view; // 该框架窗口的命令工具行 CCommandBarCtrl m_CmdBar; virtual BOOL PreTranslateMessage(MSG* pMsg); virtual BOOL OnIdle(); BEGIN_UPDATE_UI_MAP(CMainFrame) UPDATE_ELEMENT(ID_VIEW_TOOLBAR, UPDUI_MENUPOPUP) UPDATE_ELEMENT(ID_VIEW_STATUS_BAR, UPDUI_MENUPOPUP) END_UPDATE_UI_MAP() BEGIN_MSG_MAP(CMainFrame) MESSAGE_HANDLER(WM_CREATE, OnCreate) COMMAND_ID_HANDLER(ID_APP_EXIT, OnFileExit) COMMAND_ID_HANDLER(ID_FILE_NEW, OnFileNew) COMMAND_ID_HANDLER(ID_VIEW_TOOLBAR, OnViewToolBar) COMMAND_ID_HANDLER(ID_VIEW_STATUS_BAR, OnViewStatusBar) COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout) CHAIN_MSG_MAP(CUpdateUI<CMainFrame>) CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>) END_MSG_MAP() // Handler prototypes (uncomment arguments if needed): // LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) // LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) // LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); LRESULT OnFileExit(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); LRESULT OnFileNew(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); LRESULT OnViewToolBar(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); LRESULT OnViewStatusBar(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); LRESULT OnAppAbout(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); }; |
WTL视
通常应用程序的显示区域分成两个部分。一是包含窗口标题,菜单,工具栏和状态栏的主框架窗口。另一部分就是被称为视的部分。这部分是客户区,用于呈现内容给客户。
视可以是包含HWND的任何东西。通过在框架窗口处理WM_CREATE时,将该HWND句柄赋植给主窗口的m_hWndClien成员来设置主窗口的视。
比如,在用ATL/WTL App Wizard创建了一个应用程序,会创建一个视,代码如下:
class CTestView : public CWindowImpl<CTestView> { public: DECLARE_WND_CLASS(NULL) BOOL PreTranslateMessage(MSG* pMsg); BEGIN_MSG_MAP(CTestView) MESSAGE_HANDLER(WM_PAINT, OnPaint) END_MSG_MAP() // Handler prototypes (uncomment arguments if needed): // LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) // LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) // LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); }; |
在主窗口的创建函数中,将该视的HWND设置给主窗口的m_hWndClient成员。
LRESULT CMainFrame::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { … … m_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE); … … return 0; } |
到此为止,我们已经从Win32模型开始,到了解windows界面程序封装以及WTL消息循环机制,详细分析了WTL。通过我们的分析,您是否对WTL有一个深入的理解,并能得心应手的开发出高质量的Windows应用程序?别急,随后,我们还将一起探讨开发WTL应用程序的技巧。
相关文章推荐
- 深入剖析WTL—WTL框架窗口分析(5)
- 深入剖析WTL—WTL框架窗口分析(4)
- 深入剖析WTL—WTL框架窗口分析(3)
- http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=122&threadID=9172&tstart=0
- 深入剖析WTL—WTL框架窗口分析(2)
- 深入剖析WTL—WTL框架窗口分析(1)
- 深入剖析WTL——如何封装Windows界面程序
- 如何把一个lib库文件加入到VC.NET项目中去
- 深入剖析WTL——Win32模型
- Subject: ORA-02396 when idle_time = unlimited
- 深入剖析WTL—WTL消息循环机制详解
- 在2003下安装WebEasyMail邮件服务器安装过程
- Java学习从入门到精通(转贴)
- 今天有开始有了自己的blog
- 第一篇文章
- ftp上传
- HTML标签表
- com 注册 找不到映像文件 可能原因
- The difference between PASV FTP and Normal FTP
- 在DELPHI中利用ADO组件访问数据库的步骤