主题:【Windows程序设计】第二讲 消息机制
各位,久违.
让我们开始.
可曾在邮局寄过邮包? 可曾给相好递过纸条? 都干过?! 太棒了,弟真乃学习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.
让我们开始.
可曾在邮局寄过邮包? 可曾给相好递过纸条? 都干过?! 太棒了,弟真乃学习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.