| |
方法1
引子 本文所谈及的技术内容都来自于Internet的公开信息。由CKER在闲暇之际整理后,贴出来以飴网友,姑且妄称原创。 时至今日,学习Windows编程的兄弟们都知道消息机制的重要性。所以理解消息机制也成了不可或缺的功课。 大家都知道,Borland的C++ Builder以及Delphi的核心是VCL。作为Win32平台上的开发工具,封装Windows的消息机制当然也是必不可少的。 那么,在C++ Builder中处理消息的方法有哪些呢?它们之间的区别又在哪里?如果您很清楚这些,呵呵,对不起啦,请关掉这个窗口。 如果不清楚那就和我一起深入VCL的源码看个究竟吧。『注:BCB只有Professional和Enterprise版本才带有VCL源码。当然,大伙的版本都有源码的。我没猜错吧 :-)<CKER用的是BCB5>』 方法1。使用消息映射(Message Map)重载TObject的Dispatch虚成员函数 这个方法大家用的很多。形式如下 BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER( … …) END_MESSAGE_MAP( …) 但这几句话实在太突兀,C++标准中没有这样的定义。不用讲,这显然又是宏定义。它们到底怎么来的呢?CKER第一次见到它们的时候,百思不得其解。嘿嘿,不深入VCL,怎么可能理解? 在/Borland/CBuilder5/Include/Vcl找到sysmac.h,其中有如下的预编译宏定义: #define BEGIN_MESSAGE_MAP virtual void __fastcall Dispatch(void *Message) / 这样对如下的例子: VCL_MESSAGE_HANDLER(WM_PAINT,TMessage,OnPaint) END_MESSAGE_MAP(TForm1) 在预编译时,就被展开成如下的代码 virtual void __fastcall Dispatch(void *Message) 这样就很顺眼了,对吧。对这种方法有两点要解释一下: 1。virtual void __fastcall Dispatch(void *Message) 这个虚方法的定义最早可以在TObject的定义中找到。打开 很显然,所有Tobject的子类都可以重载基类的Dispatch方法,来实现自己的消息调用。如果Dispatch方法找不到此消息的定义,会将此消息交由TObject::DefaultHandler方法来处理。抽象基类TObject的DefaultHandler方法实际上是空的。同样要由继承子类重载实现它们自己的消息处理过程。 2。很多时候,我见到的第二行是这样写的: MESSAGE_HANDLER(WM_PAINT,TMessage,OnPaint) 在这里,您可以很清楚的看到几行注解,意思是ATL中同样包含了一个MESSAGE_HANDLER的宏定义,这与VCL发生了冲突。为了解决这个问题,Borland改用VCL_MESSAGE_HANDLER这样的写法。 版权说明: |