作者在 2010-11-13 18:02:12 发布以下内容
事件
windows是用户驱动的系统,用大量时间响应用户的操作,这样的系统称为事件驱动。当用户按下一个键、移动鼠标或单击一个鼠标按钮时,计算机硬件同时windows系统一个事件已经发生了,并告诉它时间的类型、发生的时间以及屏幕的位置。
事件产生的原因主要有三个:第一是通过输入设备,如键盘和鼠标;第二是通过屏幕上的可视对象,如菜单、工具栏按钮和对话框控件(可以采用鼠标和键盘产生可视事件,但windows最终将他们作为由硬件激活的一个对象);第三是由windows本身产生,如恢复一个被其他窗口覆盖的窗口。
消息
当windows知道时间发生以后,它把相关消息(如位置和时间)组成一个数据结构,与消息一起,发送给相关的程序。
windows中的消息是在windows.h中顶一个常数宏,消息一般采用WM_XX来定义,如WM_PAINT、WM_CHAR、WM_LBUTTONUP、WM_COMMAND等,消息通过以下信息发送给相关程序:
- 当前活动的应用程序
- 在当前应用程序中活动的窗口
- 事件发生时的当前光标位置
1、消息循环
在应用程序中有一消息循环,其代码如下所示:
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
只要从应用程序消息队列中接收到的消息不是WM_QUIT,消息循环就继续从消息队列中接收消息,收到WM_QUIT消息,GetMessage将返回FALSE,应用程序终止运行。TranslateMessage函数用来查看消息是否由键盘输入,是,则将原始键盘消息转化为WM_CHAR消息。TranslateMessage也可以处理键盘命令,如Ctrl+X组合键等,TranslateMessage对非键盘消息不进行任何处理。DispatchMessage消息确定应用程序由哪一个窗口获得消息,并把它发送给该窗口。
2、消息处理函数
应用程序获得消息后,进行的处理将由应用程序决定,通常情况下包括以下两种可能:
- 其一 编写消息处理函数,用来处理一个特定消息,如果存在消息处理函数,由它来处理该消息
- 其二 没有在消息处理函数中编写处理的消息,需把该消息返回windows,windows调用默认处理函数DefWindowsProc来处理