2.消息,消息队列,消息循环,消息响应
.OS将操作包装成Message
.typedef struct MSG {
HWND hwnd; //窗口句柄,即标示消息所属的窗口
UINT message;//标示消息的类别,是鼠标还是键盘等 如鼠标左键按下消息是WM_LBUTTONDOWN,键盘按下消息是WM_KEYDOWN,字符消息是WM_CHAR
WPARAM wParam;//消息的附加信息
LPARAM lParam;//消息的附加信息
DWORD time;//消息投递到消息队列中的时间
POINT pt;//鼠标的当前位置
} MSG;
.消息队列,每一个Windows应用程序开始执行后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序创建的窗口的消息
.进队消息(OS将产生的消息放在应用程序的消息队列中,让应用程序来处理)
不进队消息(OS直接调用窗口的处理过程)
.Windows应用程序的消息处理机制
while(GetMessage(&msg,NULL,0,0)){//接收到WM_QUIT消息时,才返回0
TranslateMessage(&msg);//对消息进行包装处理然后再以消息的形式投放到消息队列
DispatchMessage(&msg);//消息回传给操作系统,由操作系统调用窗口过程函数对消息进行处理
}
(1)操作系统接收到应用程序的窗口消息,将消息投递到该应用程序的消息队列中。
(2)应用程序在消息循环中调用GetMessage函数从消息队列中取出一条条的消息。取出后,以对消息进行一些预处理,如放弃对某些消息的响应,或者调用TranslateMessage产生新的消息
(3)应用程序调用DispatchMessage,将消息回传给操作系统。消息是由MSG结构体对象来表示的,其中就包含了接收消息的窗口的句柄。因此,DispatchMessage函数总能进行正确的传递。(4)系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理(即“系统给应用程序发送了消息”)。
.窗口过程函数
lresult callback windowproc(
hwnd hwnd, // 对应消息的窗口句柄
uint umsg, // 消息代码,区别消息的类型
wparam wparam, // 消息代码的附加参数1
lparam lparam // 消息代码的附加参数2
);