先上张图
一、消息处理机制
(1)操作系统接收到应用程序的“窗口消息”,将消息投递到该应用程序的消息队列中。
(2)应用程序在消息循环中调用GetMessage函数,从消息队列中取出一条一条的消息。取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应,或者调用TranslateMessage产生新的消息。
BOOL GetMessage(
LPMSG lpMsg, //消息(MSG)结构体对象
HWND hWnd, //指定接收那个窗口的消息
UINT wMsgFilterMin, //获取消息的最小值
UINT wMsgFilterMax //获取消息的最大值
);
TranslateMessage函数用于将虚拟键消息转换为字符消息。
DispachMessage函数分派一个消息到窗口过程,由窗口过程函数对消息进行处理。
获取消息还可以使用“PeekMessage”函数。
(3)应用程序调用DispatchMessage,将消息回传给操作系统。消息是由MSG结构体对象来表示的,其中就包含了接收消息的窗口的句柄。因此,DispatchMessage函数总能进行正确的传递。
(4)系统利用“WNDCLASS结构体”的“lpfnWndProc成员”保存的窗口过程函数的“指针”,调用窗口过程,对消息进行处理(即“系统给应用程序发送了消息”)。
二、窗口的过程函数
窗口过程函数的声明如下:
LRESULT CALLBACK WindowProc(
HWND hwnd, //对应消息的窗口句柄
UINT uMsg, //消息代码
WPARAM wParam, //消息代码附加参数
LPARAM lParam //消息代码附加参数
);
在窗口过程函数内部使用switch/case语句来确定窗口过程接收的是什么消息,以及如何对这个消息进行处理。
比如:
LRESULT CALLBACK WinSunProc( HWND hwnd , UINT uMsg, WPARAM wParam , LPARAM lParam )
{
switch(uMsg)
{
case WM_CHAR:
.................................
case WM_LBUTTONDOWN:
......................................
case WM_DESTROY:
..................................
default:
.................................
}
return 0;
}
朋友,如果您有什么真知灼见,可以加“新浪微博”/MSN哦,starrycheng@live.com,我们大家一起讨论,一起研究。
最后,帮忙加一分吧,想整个空间系统。