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()会把我们翻译过来的消息,分发到我们应用程序里面。同时操作系统会调用相应窗口的回调函数。

posted @ 2020-09-08 21:53  lisui  阅读(244)  评论(0编辑  收藏  举报