所谓Windows程序设计,就是编写Windows系统的窗口应用程序。
Windows是个多任务/多线程的操作系统,并且还是一个事件驱动的操作系统。在Windows操作系统中,无论是系统产生的动作还是用户在运行应用程序发出的操作动作都称为事件,而消息就是用于描述某个事件发生的信息,可以说,事件是因,消息是果。例如,按下了鼠标左键,就是一个事件,同时系统也会产生一条特定的消息来描述这个按键事件。
Windows中每一个消息所包括的信息用一个MSG结构体来表示,其定义如下:
typedef struct tagMSG{
HWND hwnd; //获取消息窗口句柄
UINT message; //消息标识符(对应整数表示)
WPARAM wParam; //记录消息附加信息的字参数
LPARAM lParam; //记录消息附加信息的长度参数
DWORD time; //消息被发送到消息队列的时间
POINT pt; //消息发送时光标所在位置
}
用户或应用程序的某些行为产生一些事件,操作系统遭到事件所属的应用程序,发送对应的消息。然后,该消息就被加入到该应用程序的消息队列之中。之后,应用程序不断的检查消息队列。每当检查到一条消息时,应用程序就将该消息发给与该消息所属窗口相关的窗口过程(WndProc)。最后,窗口过程执行与当前消息对应的指令。
图1.事件驱动模型
具体一点,Windows编程中的消息处理过程:
1.GetMessage()函数不断侦听应用程序的消息队列。
2.得到MSG,TranslateMessage()把标识的消息的整数翻译为对应的常量符,如代表窗口的消息整数翻译成WM_XXX消息表示形式,并分析解释有关信息。
3.DispatchMessage()函数通知Windows把每个消息分发给相应的窗口函数。应用程序并不直接调用窗口函数,而由Windows根据消息去调用窗口函数,因此,窗口函数也被称为回调函数。
句柄(handle)是Windows编程中的一个重要的概念。句柄是一个4字节长的整数值,是应用程序中不同对象的编号,每个对象的句柄是唯一的,应用程序通过句柄来访问相应的对象。