各位,久违. 让我们开始. 可曾在邮局寄过邮包? 可曾给相好递过纸条? 都干过?! 太棒了,弟真乃学习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.

评论