当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++ Builder教程

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

    本文所谈及的技术内容都来自于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中定义

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接