windows编程——消息机制
为什么会想学习windows编程呢?因为目前为止我的所有程序都是在windows平台下面运行的。为什么不学习呢?
今天我想记录一下自己对windows<span style="color:red">消息机制</span>的理解。
之前我学习的C/C++编程,程序运行都是按照我们的严格按照我们编写的代码一步一步执行的。
但是windows编程** 消息处理 **就明显不是在入口函数里面我们来调用。这里的区别我们仅仅从代码上面就可以看出来。
我们除了在初始化WNDCLASS实例的时候以及在进行消息循环的时候,出现过感觉可以和消息处理函数相关的代码。
While(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
整个WinMain()里面我们我们就没有关于整个消息处理的相关代码。那我们不调用,那谁来调用呢?
这个当然不是玄学,Windows除了咱们的用户模式,还有操作系统模式。如果不是我们自己调用,那么只有是操作系统自己在调用消息处理函数。
理解好了这个到底“谁调用谁”的关系后,消息机制咱们也算理解得差不多了。
接下来我们进行更加详细的讨论:
1、我们先对消息结构进行一个简单的理解。
MSG在Windows中声明如下:
{
HWND hwnd; // 接受该消息的窗口句柄
UINT message; // 消息常量标识符,也就是我们通常所说的消息号
WPARAM wParam; // 32位消息的特定附加信息,确切含义依赖于消息值
LPARAM lParam; // 32位消息的特定附加信息,确切含义依赖于消息值
DWORD time; // 消息创建时的时间
POINT pt; // 消息创建时的鼠标/光标在屏幕坐标系中的位置
}MSG;
现在我们没有完全理解这些参数的意义,但是我们在使用windows系统的时候我们明显会有疑问,为什么windows知道我们操作的是哪一个窗口?MSG里面我们明显看到了POINT这个参数,显然,windows在判断用户相关窗口操作的时候,消息产生的位置是一个重要的参考信息。
在WinMain()里面:
While(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
仅仅只有在发生WM_QUIT消息产生的时候,GetMessage()函数才会返回0。才会停止消息循环。所以我们可以把它当成一个死循环。
DisPatchMessage()会把我们翻译过来的消息,分发到我们应用程序里面。同时操作系统会调用相应窗口的回调函数。