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

C++ Builder中消息机制的研究与应用技巧

    Windows消息处理  BCB

    C++ Builder作为一种RAD方式的程序开发工具,提供了功能强大的集成开发环境。C++ Builder提供的VCL组件,封装了Windows的底层API和具体实现细节,也提供了对组件消息机制的良好封装。比如,可以对按钮控件(TButton)的单击、按下、拖动等事件消息设置相应的处理函数,并在对应的函数体中实现对该消息的处理与响应。虽然C++ Builder对VCL组件的消息处理提供了一套良好的处理机制,且封装了许多常用的消息,但是当开发者需要处理未定义的Windows消息或自定义消息时,C++ Builder不能提供直接的支持。这就需要开发者对Windows 消息驱动机制和C++ Builder 中的消息处理机制能有一个深入的认识。

    1 Windows 消息驱动机制

    Windows是以消息驱动的操作系统,Windows 消息提供了应用程序与应用程序以及应用程序与Windows系统之间进行通讯的手段。Windows 中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。

    消息循环代码是应用程序中主函数winmain ( )中类似如下的程序段:

 while(GetMessage(&msg,NULL,NULL,NULL))
  {
   ……
   //从消息队列中取得消息后,检索并生成字符消息
   TranslateMessage(&msg);
   //将消息发送给相应的窗口函数
   DispatchMessage(&msg); 
  }
    由此可见,所谓“消息循环”,实际是程序循环。Windows 应用程序创建的每个窗口都在系统核心注册一个相应的窗口函数,窗口函数程序代码形式上是一个switch-case 语句,用以处理由消息循环发送到该窗口的消息。
 Switch(msg)
  {
  case … : …
      break;
  ……
  default : …
      break;
  }

    窗口函数由Windows 采用消息驱动的形式隐式地调用(由系统调用),而不是由应用程序显示调用的,窗口函数处理完消息后又将控制权返回给Windows.

    Windows消息处理过程实质包括以下四个步骤:(1) 系统发生事件;(2) 根据事件产生消息,并放入消息队列;(3) 应用程序从消息队列中取得消息,并封装后,通过消息循环把消息分派给对应的处理函数;(4) 处理函数最终处理这个消息。

    2  C++ Builder 中的消息处理

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

 

//Windows 应用程序主函数
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
 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 方法检查不同的条件,作不同的处理,从而能够滤掉不希望处理的各种消息。最终,WndProc 调用 Dispatch 方法,它是一个从所有控件的始祖TObject 继承而来的虚拟方法,它确定调用哪个方法处理传来的消息。

    以上是消息在控件中的传递过程,C++ Builder对消息处理作了进一步的封装,把常用的消息封装成相应的事件属性,开发者只要把精力放在响应函数设计和建立消息与处理函数的映射关系上。

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