您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > BCB > 正文
C++ Builder中消息处理过程及应用
[文章信息]
作者:
时间:2003-05-09
出处:C++ Builder开发者
责任编辑:
[文章导读]
C++ Builder作为一种RAD方式的程序开发工具,其全新的可视化编程环境、面向组件的开发模式无疑会大大地提高编程效率
advertisement
热点推荐
· 11.15软件精选 制作MSI文件
· 闪客五周年之闪客光荣榜
· 用Winamp“品尝”无限音乐
· 网络加、解密的技术应用
· 闪客五周年之闪客光荣榜:zoron
[正文]

上一页  1 2  

  二、C++ Builder 中的消息处理

  有了以上Windows 系统消息驱动模式程序设计的认识,下面分析一下C++ Builder中消息处理是如何封装、实现的。

   Windows 程序框架,包括一些初始化、消息循环代码等,在类 Application中封装、实现。每一个用C++ Builder 编写的Windows GUI 应用程序,大部分缺省生成如下代码:

  WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

  //Windows 应用程序主函数

   {

      try

      {

  Application-〉Initialize();//作初始化

  Application-〉CreateForm(__classid(TForm1), &&Form1);

  Application-〉Run();

  //其中包含消息循环

   }

   catch (Exception &&exception)  //例外处理

   {

  Application-〉ShowException(&&exception);

   }

   return 0;

  }

  对于消息处理,C++ Builder采用基于控件(component)的程序设计模式,每种控件都继承一套完整的消息派送体系。其实现方法如下: 它为每一种类型的控件都注册一个名为 MainWndProc 的方法函数作为窗口函数,接受“消息循环”派送来的消息,它是一个非虚拟方法,不对任何特定消息作特别处理,它仅仅调用 WndProc 方法函数,并作一些例外处理。不同控件对消息处理的定制发生在WndProc 方法中,因为它是一个虚拟方法,每一种控件可以通过覆盖它来适应特别的情况。WndProc 方法检查不同的条件,作不同的处理,从而能够滤掉不希望处理的各种消息。例如:当控件正被拖动时,应忽略键盘事件,所以在Twincontrol 类的WndProc 方法中,有判断当控件不是被拖放状态、才继续传递键盘消息这样功能的代码。最终,WndProc 调用 Dispatch 方法,它是一个从所用控件的起始祖先Tobject 继承而来的虚拟方法,它确定调用哪个方法处理传来的消息。Dispatch 使用消息结构(Tmessage)中的 msg 成员变量确定如何处理一个特定的消息,如果控件定义了处理这一消息的函数,则调用它,否则,就逐级向上追溯,看祖先类是否定义此类的处理方法,直到起始祖先类(Tobject)。如果都没有定义处理方法,则调用缺省的处理方法(DefaultHandler)。

  以上是消息在控件中的传递过程,INPRISE公司为方便用户,对消息处理作了进一步的封装,把常用的消息封装成相应的事件属性,这样编程者完全不用考虑消息细节,只要编写事件处理方法,并给事件属性赋值即可。

  三、应用实例

  下面以增加新的自定义消息处理过程为例,对以上所述内容做进一步的说明。

  通过以上分析我们知道,每一条消息的具体处理过程,是在 Dispatch 中派发完成的,因此增加新的消息, 只要覆盖虚拟函数 Dispatch 即可。

  C++ Builder为了方便地处理消息,定义了以下三个处理消息的宏:

  BEGIN_MESSAGE_MAP

  VCL_MESSAGE_HANDLER(msg,type,meth)

  END_MESSAGE_MAP(base)

  定义如下:

  #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;

  #define END_MESSAGE_MAP(base)  default:

   base::Dispatch(Message);

     break;

  }

   }

  我们只需在控件类或自定义控件类的public节,依次写入三个宏即可,其中宏VCL_MESSAGE_HANDLER可以根据处理消息的条数而出现多次。宏展开后,即生成一个新的Dispatch 函数,它先判断处理用户定义消息,若是其他消息,则传递至父类的Dispatch 函数处理,从而完成自定义消息的处理并保证原来消息处理体系的完整性。


上一页  1 2  

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载


发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • 用C++ Builder开发多层数据库应用程序
  • 用C++ Builder创建数字签名
  • C++Builder IDE使用技巧与快捷键
  • 在C++ Builder中用Ole控制Excel表
  • 利用C++ Builder 设计实现文件切割机
  • 用C++Builder实现Windows 2000的Messenger
  • 在 C++ Builder中利用串行通信控件编程
  • C++Builder中集合的处理
  • 11.15软件精选 制作MSI文件
  • 闪客五周年之闪客光荣榜
  • 兰欣推出我国第一款网络游戏专用音箱
  • 玩家发现117亡灵种族Bug
  • [配置推荐]极品HIFI配置
  • 东瀛美少女COSPLAY(55)
  • 用Winamp“品尝”无限音乐
  • 迷你型PStwo全面透析专题
  • Advertisement