专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C 教程 » powerbuilder:C++ Builder中消息处理过程及应用 »正文

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

来源: 发布时间:星期四, 2009年2月12日 浏览:93次 评论:0


c builder作为种rad方式开发工具其全新可视化编程环境、面向组件开发模式无疑会大大地提高编程效率它对繁杂windows 消息及api作了较全面封装编程者在大多数情况下不需理会windows消息细节只要将心思放在组件事件处理上即可然而毕竟windows操作系统是个以消息驱动系统运行其上应用自然无法脱离系统的外因此掌握并运用消息处理些问题处理会有事半功倍效果

  尽管c buildervclControl控件封装了大多数常用消息c builder所提供事件处理能力也具备了相当程度完备性但当处理c builder 未定义windows消息或自定义消息时掌握c builder 内部消息处理机制还是十分必要下面从windows 操作系统消息驱动机制开始进而探讨c buildervclControl控件中消息封装、传递和处理机制最后以新增消息处理过程应用例子作为对所讲内容验证和实战

  、windows 消息驱动机制

  windows是以消息驱动操作系统windows 消息提供了应用和应用以及应用和windows系统的间进行通讯手段

  windows 中有个系统消息队列对于每个正在执行windows应用,系统为其建立个“消息队列”即应用队列用来存放该可能创建各种窗口消息应用中含有段称作“消息循环”代码用来从消息队列中检索这些消息并把它们分发到相应窗口

  消息循环代码是应用中主win ( )中类似如下段:

  while(getmessage(&&msg,null,null,null))

  { //从消息队列中取得消息

  translatemessage(&&msg);

  //检索并生成消息wm_char

  dispatchmessage(&&msg);

  //将消息发送给相应窗口

   }

  由此可见所谓“消息循环”,实际是循环

  windows 应用创建每个窗口都在系统核心注册个相应窗口窗口代码形式上是个巨大switch 语句用以处理由消息循环发送到该窗口消息窗口由windows 采用消息驱动形式直接而不是由应用显示窗口处理完消息后又将控制权返回给windows

  系统消息队列、应用队列、消息循环和窗口的间关系如图1所示

   2、c builder 中消息处理

  有了以上windows 系统消息驱动模式设计认识下面分析下c builder中消息处理是如何封装、实现

   windows 框架包括化、消息循环代码等在类 application中封装、实现个用c builder 编写windows gui 应用大部分缺省生成如下代码:

  winapi win(hinstance, hinstance, lpstr, )

  //windows 应用

   {

      try

      {

  application-〉initialize;//作

  application-〉createform(__id(tform1), &&form1);

  application-〉run;

  //其中包含消息循环

   }

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

   {

  application-〉showexception(&&exception);

   }

   0;

  }

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

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

  消息在的间传递关系如表1所示

   3、应用例子

  下面以增加新自定义消息处理过程为例对以上所述内容做进介绍说明

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

  c builder为了方便地处理消息定义了以下 3个处理消息宏:

  begin_message_map

  vcl_message_handler(msg,type,meth)

  end_message_map(base)

  定义如下:

  # begin_message_map virtual void __fastcall dispatch(void message)

  {                     switch (((pmessage)message)-〉msg)    

  {

  # vcl_message_handler(msg,type,meth)    

    msg:

  meth(((type)message));       ;

  # end_message_map(base)  default:

   base::dispatch(message);

     ;

  }

   }

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

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: