回 帖 发 新 帖 刷新版面

主题:【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.
   




回复列表 (共4个回复)

沙发

这么短,能不能说说原理,用中断的吗?

板凳

good b l....

3 楼

g

4 楼

挺精辟的 消息就素个邮包

我来回复

您尚未登录,请登录后再回复。点此登录或注册