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 应用程序创建的每个窗口都在系统核心注册一个相应的窗口函数&