1、消息的概念
消息是Windows 操作系统发给应用程序的通告,它告诉应用程序某个特定事件发生了。比如用户单击鼠标或按键都会引发Windows 系统发送相应消息。最终处理消息的是应用程序的窗口函数,如果程序不处理系统将会作出默认处理。
2、消息结构
typedef struct tagMSG
{
HWND hwnd;//hwnd 是窗口句柄,这个参数决定由哪个窗口过程函数对消息进行处理;
UINT message;//消息常量,用来表示消息的类型;
WPARAM wParam;
LPARAM lParam;//wParam 和lParam 都是32 位的附加信息,具体表示什么,要视消息类型而定;
DWORD time;消息发送的时间;
POINT pt;pt 是消息发送时鼠标所在的位置;
}MSG;
3、消息队列
Windows 程序是事件驱动的,存在两种消息队列,一种是系统消息队列,另一种是应用程序消息队列。
计算机的所有输入设备由 Windows 监控,当一个事件发生时,Windows 先将输入的消息放入系统消息队列中,然后再将输入的消息拷贝到相应的应用程序队列中,应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中。Windows 程序的执行顺序将取决于事件的发生顺序,具有不可预知性。
4、消息循环
应用程序通过GetMessage()函数取得消息并存于一个消息结构体中,然后通过一个TranslateMessage()和DispatchMessage()解释和分发消息。while(GetMessage (&msg, NULL, 0, 0))//GetMessage()在取得WM_QUIT 之前的返回值都为TRUE,也就是说只有获取到
WM_QUIT 消息才返回FALSE,才能跳出消息循环。
{
TranslateMessage (&msg) ;//对于大多数消息而言不起作用,但是有些消息如键盘按键按下和弹起(分别对于KeyDown 和KeyUp 消息),却需要通过它解释产生一个WM_CHAR消息
DispatchMessage (&msg) ;//负责把消息分发到消息结构体中对应的窗口,交由窗口过程函数处理。
}
5、默认窗口过程处理函数
每一个窗口类都有一个窗口过程函数,此函数是一个回调函数,它是由Windows 操作系统负责调用的,应用程序本身不能调用它。
LRESULT CALLBACK WndProc
(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam
)
{
…
switch(uMsgId)
{
case WM_TIMER://对WM_TIMER 定时器消息的处理过程
return 0;
case WM_LBUTTONDOWN://对鼠标左键单击消息的处理过程
reurn 0;
. …
default:
return DefWindowProc(hwnd,uMsgId,wParam,lParam);
}
}
对于每条已经处理过的消息都必须返回0,否则消息将不停重试下去;
对于不感兴趣的消息,交给DefWindowProc()函数进行处理,并需要返回其处理值。