深入VCL 理解BCB的消息机制 (一)

原创 2001年06月09日 15:53:00

 

 

 

深入VCL 理解BCB的消息机制

方法1

Written by
CKER

引子

    本文所谈及的技术内容都来自于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) /
        { /
            switch (((PMessage)Message)->Msg) /
            {

#define VCL_MESSAGE_HANDLER(msg,type,meth) /
             case msg: /
                    meth(*((type *)Message)); /
             break;

// NOTE: ATL defines a MESSAGE_HANDLER macro which conflicts with VCL's macro. The
// VCL macro has been renamed to VCL_MESSAGE_HANDLER. If you are not using ATL,
// MESSAGE_HANDLER is defined as in previous versions of BCB.
file://
#if !defined(USING_ATL) && !defined(USING_ATLVCL) && !defined(INC_ATL_HEADERS)
#define MESSAGE_HANDLER VCL_MESSAGE_HANDLER
#endif
// ATL_COMPAT

#define END_MESSAGE_MAP(base) 
             default: /
                  base::Dispatch(Message); /
             break; /
            } /
        }

这样对如下的例子:

BEGIN_MESSAGE_MAP

VCL_MESSAGE_HANDLER(WM_PAINT,TMessage,OnPaint)

END_MESSAGE_MAP(TForm1)

在预编译时,就被展开成如下的代码

virtual void __fastcall Dispatch(void *Message) 
{
      switch (((PMessage)Message)->Msg) 
     {
       case WM_PAINT:
                OnPaint(*((TMessage *)Message));
//消息响应句柄,也就是响应消息的成员函数,在Form1中定义
       break;

       default:
                Form1::Dispatch(Message);
       break;
     }
}

这样就很顺眼了,对吧。对这种方法有两点要解释一下:

1。virtual void __fastcall Dispatch(void *Message) 这个虚方法的定义最早可以在TObject的定义中找到。打开
BCB的帮助,查找TForm的Method(方法),你会发现这里很清楚的写着Dispatch方法继承自TObject。如果您关心VCL的继承机制的话,您会发现TObject是所有VCL对象的基类。TObject的抽象凝聚了Borland的工程师们的心血。如果有兴趣。您应该好好查看一下TObject的定义。

很显然,所有Tobject的子类都可以重载基类的Dispatch方法,来实现自己的消息调用。如果Dispatch方法找不到此消息的定义,会将此消息交由TObject::DefaultHandler方法来处理。抽象基类TObject的DefaultHandler方法实际上是空的。同样要由继承子类重载实现它们自己的消息处理过程。

2。很多时候,我见到的第二行是这样写的:

MESSAGE_HANDLER(WM_PAINT,TMessage,OnPaint)

在这里,您可以很清楚的看到几行注解,意思是ATL中同样包含了一个MESSAGE_HANDLER的宏定义,这与VCL发生了冲突。为了解决这个问题,Borland改用VCL_MESSAGE_HANDLER这样的写法。
当您没有使用ATL的时候,MESSAGE_HANDLER将转换成VCL_MESSAGE_HANDLER。但如果您使用了ATL的话,就会有问题。所以我建议您始终使用VCL_MESSAGE_HANDLER的写法,以免出现问题。

版权说明:
您可以随意复制、分发、下载此文档。但未经本人同意,您不可以截取、改动本文片断,或用本文谋取任何形式的利益。

深入VCL理解BCB的消息机制2

深入VCL理解BCB的消息机制2 2012-12-25 19:54未知admin . 关键字:   重载TControl的WndProc方法   还是先谈谈VCL的继承策略。VCL中的继承链...
  • ksrsoft
  • ksrsoft
  • 2013年04月09日 15:38
  • 1009

深入VCL 理解BCB的消息机制(三)

New Page 1
  • cker
  • cker
  • 2001年06月25日 02:29
  • 3973

BCB消息消息机制

方法1:使用消息映射(Message Map)重载TObject的Dispatch虚成员函数   形式如下:   BEGIN_MESSAGE_MAP     VCL_MESSAGE_HA...
  • u010984552
  • u010984552
  • 2016年07月06日 21:07
  • 668

BCB自定义消息

[cpp] view plaincopy 发送:   头文件定义:   //自定义消息 WM_USER+数值 高点以免被占用   #define WM_BSNBST...
  • cddchina
  • cddchina
  • 2014年08月12日 17:11
  • 2154

深入VCL 理解BCB的消息机制 (一)

   
  • cker
  • cker
  • 2001年06月09日 15:53
  • 3294

enode框架step by step之消息的重试机制的设计思路

对于一个EDA架构为基础的框架,核心就是消息驱动,然后基于最终一致性的原则。所以,非常重要的一点是,如果消息一次执行不成功,那该怎么办?我能想到的对策就是消息的重试。我发现,这篇文章比较难写,因为感觉...
  • u011607401
  • u011607401
  • 2013年08月05日 18:24
  • 837

深入VCL 理解BCB的消息机制

...
  • sxia200
  • sxia200
  • 2007年05月24日 10:47
  • 1153

深入VCL 理解BCB的消息机制(二)

 方法2。重载TControl的WndProc方法还是先谈谈VCL的继承策略。VCL中的继承链的顶部是TObject基类。一切的VCL组件和对象都继承自TObject。打开BCB帮助查看TContro...
  • powder111
  • powder111
  • 2009年05月08日 11:29
  • 300

C++ Builder中消息处理过程及应用

  C++ Builder作为一种RAD方式的程序开发工具,其全新的可视化编程环境、面向组件的开发模式无疑会大大地提高编程效率。它对繁杂的Windows 消息及API作了较全面的封装,编程者在大多数情...
  • Tunix126
  • Tunix126
  • 2006年10月15日 13:16
  • 612

深入BCB理解VCL的消息机制

深入BCB理解VCL的消息机制引子:本文所谈及的技术内容都来自于Internet的公开信息。由笔者在闲暇之际整理后,贴出来以飴网友,姑且妄称原创。每次在国外网站上找到精彩文章的时候,心中都会暗自叹息,...
  • diligentcat
  • diligentcat
  • 2011年05月26日 10:44
  • 925
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入VCL 理解BCB的消息机制 (一)
举报原因:
原因补充:

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