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

转载 2007年09月30日 10:58:00
在上面的例子中,CDerived从CBase中派生出来。CDerived类通过定义一个WM_LBUTTONDOWN消息处理函数来改变CBase类代表的窗口的功能。

这样,CBase类的消息映射定义了一个ProcessWindowMessage()函数,而CDerived类的消息映射也定义了一个ProcessWindowMessage()函数。

那么,我们在窗口处理函数逻辑中怎样把这两个类的ProcessWindowMessage()连起来呢?(想想为什么要连起来?)

在CDerived的消息映射中,有一个宏CHAIN_MSG_MAP()。它的作用就是把两个类对消息的处理连起来。

看一下这个宏的定义:

#define CHAIN_MSG_MAP(theChainClass) /	{ /if(theChainClass::ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult)) /			return TRUE; /	}


很简单,它仅仅调用了基类的ProcessWindowMessage()函数。

也就是说,CDerived类的ProcessWindowMessage()包含两部分,一部分是调用处理WM_LBUTTONDOWN的消息处理函数,该函数是该类的成员函数。第二部分是调用CBase类的ProcessWindowMessage()函数,该函数用于处理WM_DESTROY消息。

在后面对窗口函数的封装中,我们会知道,对于其他消息处理,CDerived会传递给缺省窗口函数。

派生和ALT_MSG_MAP()

如果我们希望在CBase类上再派生一个新的窗口类。该类除了要对WM_RBUTTONDOWN做不同的处理外,还希望CBase对WM_DESTROY消息的响应与前一个例子不同。比如希望能提示关闭窗口信息。

那怎么处理呢?ATL提供了一种机制,它由ALT_MSG_MAP()实现。它使得一个类的消息映射能处理多个Windows窗口类。

下面是具体的示例:

// in class CBase:   BEGIN_MSG_MAP( CBase )      MESSAGE_HANDLER( WM_DESTROY, OnDestroy1 )      ALT_MSG_MAP( 100 )      MESSAGE_HANDLER( WM_DESTROY, OnDestroy2 )   END_MSG_MAP()


ALT_MSG_MAP()将消息映射分成两个部分。每个部分的消息映射都有一个ID。上面的消息映射的ID分别为0和100。

分析一下ALT_MSG_MAP():

#define ALT_MSG_MAP(msgMapID) /		break; /		case msgMapID:


很简单,它结束了前面的msgMapID的处理,开始进入另一个msgMapID的处理。

那么,在CDerived类的消息映射中,是怎样将两个类的ProcessWindowMessage()函数的逻辑连在一起的呢?

// in class CDerived:   BEGIN_MSG_MAP( CDerived )      CHAIN_MSG_MAP_ALT( CBase, 100 )   END_MSG_MAP()


这里使用CHAIN_MSG_MAP_ALT()宏。它的具体定义如下:

#define CHAIN_MSG_MAP_ALT(theChainClass, msgMapID) /{ /if(theChainClass::ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, msgMapID)) /	return TRUE; /	}


不再分析其原理。请参考前面对CHAIN_MSG_MAP()宏的分析。
 

相关文章推荐

深入剖析WTL—WTL框架窗口分析

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

深入剖析WTL窗口框架

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

深入剖析WTL框架(二)

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

深入剖析WTL框架(一)

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

深入剖析WTL框架(五)

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

深入剖析WTL框架(六)

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

深入剖析WTL框架(四)

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

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
  • 379
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入剖析WTL—WTL框架窗口分析(3)
举报原因:
原因补充:

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