正文

第二讲 消息机制2005-07-04 00:15:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/caoxin/2509.html

分享到:

各位,久违.   让我们开始.   可曾在邮局寄过邮包? 可曾给相好递过纸条? 都干过?! 太棒了,弟真乃学习Windows程序的不二好胚.请看下图:(至少我认为是图)    ----------------------------------------------------------------------   |                            系统消息队列                              |    ----------------------------------------------------------------------           ↓                       ↓                        ↓    ------------------       -------------------         ------------------   | 应用程序消息队列1 |    | 应用程序消息队列2 |       | 应用程序消息队列3|    ------------------       -------------------         ------------------          ↓↑                    ↓↑                         ↓↑    --------------------    ----------------------    ---------------------   |   应用程序1        |  |      应用程序2       |  |       应用程序3     |   |  -------------     |  |     -------------    |  |     -------------   |   | | WinMain中的 |    |  |    | WinMain中的 |   |  |    | WinMain中的 |  |   | | 消息循环    |    |  |    | 消息循环    |   |  |    | 消息循环    |  |   |  -------------     |  |     -------------    |  |     -------------   |   |     ↓    ↓       |  |       ↓     ↓      |  |     ↓      ↓      |     | 窗口过程1 窗口过程2|  | 窗口过程1 窗口过程2  |  |  窗口过程1 窗程2    |      --------------------    ----------------------    ---------------------    Windows是个抢占式多任务系统.在其上可以运行多个Windows程序,而Windows只有一个系统消息队列,并为每一个Windows程序维护一个应用程序消息队列.队列者,先进先出的一块内存区.    队列中的消息如何产生? 事件产生.    何为事件? 某键按下、鼠标移动、最大化窗口等等行为皆为事件.    需各位牢记的是:Windows应用程序的运行需要依靠外部发生的事件来驱动.Windows程序所做的一切都是响应发送给窗口过程的消息.不过由于事件只是个概念化的东西,而由它产生的消息具有实际的使用意义,所以让我们简化一下,只谈消息不提事件.即某键按下的事件就称为某键按下的消息.    消息长的帅吗? 让我们去瞅瞅: typedef struct tagMSG          {              HWND   hwnd ;    //接受该消息的窗口句柄              UINT   message ; //消息的种类              WPARAM wParam ;  //与消息种类相关的消息参数              LPARAM lParam ;  //同上              DWORD  time ;    //消息放入消息队列的时间              POINT  pt ;      //消息放入队列时鼠标的位置          }          MSG, * PMSG ; 看出来了吗? 它象不象个邮包? 不象吗? typedef struct tagMSG          {              HWND   hwnd ;    //接受该邮包的单位              UINT   message ; //邮包的种类(是书、糕点或其他)              WPARAM wParam ;  //书的页数或糕点的盒数              LPARAM lParam ;  //书的其他重要特征或糕点的其他重要特征              DWORD  time ;    //邮包寄出的时间(即邮戳)              POINT  pt ;      //消息放入队列时鼠标的位置          }          MSG, * PMSG ;    需说明的是:WPARAM 和 LPARAM 在 Win16 中是不同的两个数据类型, 在 Win32 中它们类型一样,都是32位的int型. 而 POINT 是个结构体类型, like this: typedef  struct tagPOINT { int x; int y; } POINT, * PPOINT;    另外: 给相好递纸条怎么回事? 在这件事上你并没有通过邮局啊? 是的,你做的很对,如果也通过邮局,相好被人捷足先登拐跑了呢.所以,就某些希望尽快处理的消息,可以不放入消息队列直接送到窗口过程去. 这些称为不进队消息.       本讲的总结:                系统消息队列 like 中央邮政总局            应用程序消息队列 like 各地方邮政分局                进队列的消息 like 邮包              不进队列的消息 like 快递    Windows程序就是靠各种各样递来传去的消息(邮包)来保持通信并运行的.    在下讲你将看到实例.    0ver.    

阅读(2753) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册