WEB开发网
开发学院软件开发VC ATL3.0中的窗口类 阅读

ATL3.0中的窗口类

 2006-07-22 22:53:41 来源:WEB开发网   
核心提示: Why?因为我们必须明确地将一个消息映射表链接到另外一个,如下: BEGIN_MSG_MAP( CDerived ) MESSAGE_HANDLER( WM_LBUTTONDOWN, OnButtonDown ) CHAIN_MSG_MAP( CBase ) // 链接到基类END_MSG

Why?因为我们必须明确地将一个消息映射表链接到另外一个。如下: BEGIN_MSG_MAP( CDerived )
  MESSAGE_HANDLER( WM_LBUTTONDOWN, OnButtonDown )
  CHAIN_MSG_MAP( CBase ) // 链接到基类
END_MSG_MAP()
现在,任何在CDrived类中没有被处理的消息都会被传到CBase类中。

为什么不自动将派生类的消息映射和它的基类的消息映射链接起来呢?这是因为在ATL的体系结构中有很多多重继承的情况,这种情况下没有办法知道究竟应该链接到哪个基类,所以只好让程序员自己来做决定。

可选的消息映射:

消息映射链允许多个类同时进行消息处理,同时也带来了问题:如果我们在多个类中都要响应WM_CREATE消息,但是不同的类需要基类提供不同的处理,怎么办呢?为了解决这个问题,ATL使用了可选的消息映射:将消息映射表分成很多节,每一节用不同的数字标识,每一节都是一个可选的消息映射表。 // in class CBase:
  BEGIN_MSG_MAP( CBase )
   MESSAGE_HANDLER( WM_CREATE, OnCreate1 )
   MESSAGE_HANDLER( WM_PAINT, OnPaint1 )
   ALT_MSG_MAP( 100 )
   MESSAGE_HANDLER( WM_CREATE, OnCreate2 )
   MESSAGE_HANDLER( WM_PAINT, OnPaint2 )
   ALT_MSG_MAP( 101)
   MESSAGE_HANDLER( WM_CREATE, OnCreate3 )
   MESSAGE_HANDLER( WM_PAINT, OnPaint3 )
  END_MSG_MAP()
如上,基类的消息映射表由3节组成:一个默认的消息映射表(隐含的标识为0)和两个可选的消息映射表(标识为100和101)。

当你链接消息映射表时,指定你所希望的方案的标识,如下: class CDerived: public CBase {
  BEGIN_MSG_MAP( CDerived )
   CHAIN_MSG_MAP_ALT( CBase, 100 )
  END_MSG_MAP()
  ...
CDrived类的消息映射表链接到CBase类中标识号为100的可选节,因此当WM_PAINT到达时,CBase::OnPaint2被调用。

上一页  4 5 6 7 8 9 10  下一页

Tags:ATL 窗口

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接