2.2.1 消息概述
在Windows操作系统中,提供了一系列的API函数来实现界面的绘制功能,例如DrawText 绘制文字、DrawEdge绘制边框、DrawIcon绘制图标、BitBlt绘制位图和Rectangle绘制矩形。即使再复杂的程序界面,也都是通过API函数实现绘制的。
为了确定在什么时候调用这些函数,我们需要一个控制中心来"发号施令"。并且还需要一个命令传达机制,将命令即时地传达到目的地。这个控制中心犹如一颗心脏,源源不断地将血液送往需要的器官。而这个命令传达机制就是Windows消息机制,Windows消息就好比是身体中的血液,它是命令传达的使者。
Windows消息控制中心采用三层结构。
第一级控制中心是顶端的Windows内核:Windows内核维护着一个消息队列,第二级控制中心从这个消息队列中获取属于自己管辖的消息,后做出处理,有些消息直接处理掉,有些还要发送给下一级窗体(Window)或控件(Control)。
第二级控制中心是各Windows应用程序的Application对象。
第三级控制中心是Windows窗体对象,每一个窗体都有一个默认的窗体过程,这个过程负责处理各种接收到的消息。
具体如图2-1所示。
|
| 图2-1 Windows消息多级控制中心 |
图2-1中各个对象的具体说明如下。
Windows:指Windows操作系统。
Window:表示Windows窗口。
窗体:包括窗口,以及有句柄的控件。
Control:指控件,控件本身也可能是一个窗口,也可能不是。
Application:即应用程序,应用程序也可能不会用到Windows消息机制,这里我们专门讨论有消息循环的应用程序。
消息是以固定的结构传送给应用程序的,具体结构如下:
- typedef struct tagMSG {
- HWND hwnd;
- UINT message;
- WPARAM wParam;
- LPARAM lParam;
- DWORD time;
- POINT pt;
- } MSG
其中hwnd是窗体的句柄,message是一个消息常量,用来表示消息的类型,wParam和lParam都是32位的附加信息,具体表示什么内容,要视消息的类型而定,time是消息发送的时间,pt是消息发送时鼠标所在的位置。
Windows操作系统中包括以下几种消息。
标准Windows消息:此类消息以WM_开头。
通知消息:通知消息是针对标准Windows控件的消息。通知信息控件有按钮(Button)、组合框(ComboBox)、编辑框(TextBox)、列表框(ListBox)、ListView、TreeView、工具条(Toolbar)、菜单(Menu)等控件。每种消息都会以不同的字符串打头。
自定义消息:即编程(www.cppentry.com)人员还可以自定义消息。