深入剖析WTL—WTL框架窗口分析(6)

转载 2007年09月30日 10:52:00
 
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*/);};


DECLARE_FRAME_WND_CLASS()宏是为框架窗口指定一个资源ID,可以通过这个ID和应用程序的资源联系起来,比如框架的图标,字符串表,菜单和工具栏等等。

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*/);};


这个视是一个从CWindowImpl派生的窗口。

在主窗口的创建函数中,将该视的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框架窗口分析

WTL的基础是ATL。WTL的框架窗口是ATL窗口类的继承。因此,先介绍一下ATL对Windows窗口的封装。 由第一部分介绍的Windows应用程序可以知道创建窗口和窗口工作的逻辑是: ...
  • zcxin
  • zcxin
  • 2013年10月23日 01:42
  • 1381

深入剖析WTL窗口框架

深入剖析WTL 1、  wtl对窗口的封装 2、  消息封装 3、  消息路由   一、Wtl对窗口的封装 一般我们使用WTL创建窗口的时候继承CWindowImpl和CDialog...

深入剖析WTL框架(二)

ATL的消息处理宏 消息映射的目的是实现ProcessWindowMessage()。ProcessWindowMessage()函数是窗口函数的关键逻辑。 一共有三种消息处理宏,分别...
  • a199228
  • a199228
  • 2011年11月28日 20:36
  • 443

深入剖析WTL框架(一)

WTL的基础是ATL。WTL的框架窗口是ATL窗口类的继承。因此,先介绍一下ATL对Windows窗口的封装。 由第一部分介绍的Windows应用程序可以知道创建窗口和窗口工作的逻辑是: 1 注...
  • a199228
  • a199228
  • 2011年11月28日 20:34
  • 752

深入剖析WTL框架(五)

ATL对窗口消息处理函数的封装 在本节开始部分谈到的封装窗口的两个难题,其中第一个问题是怎样解决将窗口函数的消息转发到HWND相对应的类的实例中的相应函数。 下面我们来看一下,ATL采用的是...
  • a199228
  • a199228
  • 2011年11月28日 20:39
  • 486

深入剖析WTL框架(六)

WTL对框架窗口的封装 ATL仅仅是封装了窗口函数和提供了消息映射。实际应用中,需要各种种类的窗口,比如,每个界面线程所对应的框架窗口。WTL正是在ATL基础上,为我们提供了框架窗口和其他各...
  • a199228
  • a199228
  • 2011年11月28日 20:40
  • 714

深入剖析WTL框架(四)

superclass superclass是一种生成新的窗口类的方法。它的中心思想是依靠现有的窗口类,克隆出另一个窗口类。被克隆的类可以是Windows预定义的窗口类,这些预定义的窗口类有按钮或下...
  • a199228
  • a199228
  • 2011年11月28日 20:38
  • 569

VC—主框架窗口绘制背景

  • 2011年04月26日 22:41
  • 28KB
  • 下载

WTL之dll内嵌窗口代码结构分析

分析一下今天所看代码的结构,以做记录并整理思路;婴儿学步。 WTL之dll内嵌窗口代码结构分析: dll_xxx.def : 导出dll函数。dll_xxx.h    : dll对应类的定...

VC—主框架窗口绘制背景

VC—主框架窗口绘制背景  转自skyremember的专栏使用VC进行项目开发,特别是简单的MIS系统开发中,通常在用户没有进行操作之前显示的是主框架的窗口(用户点击操作菜单项再弹出处理窗口)。因此...
  • adermxl
  • adermxl
  • 2011年04月22日 16:15
  • 381
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入剖析WTL—WTL框架窗口分析(6)
举报原因:
原因补充:

(最多只允许输入30个字)