当前位置:C++技术网 > 精选软件 > Windows零基础入门:2.7.1节消息机制补充说明(消息队列)

Windows零基础入门:2.7.1节消息机制补充说明(消息队列)

更新时间:2015-08-14 12:27:01浏览次数:1+次

    2.7节的图中说明了消息机制和窗口机制,对于消息机制的消息队列部分,太过于抽象,虽然是对零基础入门来做的图,不过,为了更加清晰的理解,单独做一个补充说明。帮助有一点基础的同学进一步了解一下。不过这些在后面的消息机制中会更加详细深入的讲解,这里先给出补充说明。

    在《Windows零基础入门:2.7 Win32窗口机制和消息机制整体流程》里面,我在讲解了Win32的整体的消息机制,谈到了消息队列。而图中标明的消息队列为窗口消息队列。主要是为了突出这个消息与窗口的关系。但是我们深入学习,需要更加深入的背景。那么此时的我们需要更加具体的去了解。
    为什么我想到了补充说明呢?
    看看获取消息处理消息和分派消息的代码:

while(GetMessage(&msg,NULL,0,0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

    你会发现,在三个函数中,你发现并没有窗口句柄的存在。也就是说,这三个函数不需要窗口句柄。那么如何将具体的消息正确的处理的呢?
    这里我们不做深入细致的流程解说。我们在2.7节的基础上再加深一步理解就好。
    而2.7节说的是窗口消息队列。不过那里是一个粗略的说法。给没有任何基础的人容易理解的解释。
    这里就仔细说说消息队列的情况,不过具体的消息处理过程,我们在消息机制部分来详细说。
    下面对于消息队列这里进行补充说明。给一张图来说明。
窗口消息队列补充说明
    消息处理的三个函数都是直接与消息队列打交道的。而他们又不要窗口句柄,也就是说,我们无法将这些函数与一个窗口消息队列关联。是不是之前说的有问题呢?
    表面上来说,确实有问题。不过2.7图里是对此进行了抽象。每一条消息确实关联一个窗口的。在2.7节的图里,我们是将与一个窗口相关的所有消息,抽象为一个消息队列,而这个事实上不存在。在本文图中,你可以看到,一个进程就一个消息队列。在这个消息队列中,每一个消息都带有窗口句柄。那么这三个消息相关的函数,就是直接处理这个进程消息队列的。所以他们不需要窗口句柄。GetMessage函数直接在进程消息队列取消息。DispatchMessage函数根据消息中的句柄,来分发到具体的窗口。
    这样你就理解了这三个函数我们不需要句柄。实则是内部机制没有明白。之前的解释,对此没有深入详细解释,所以在此补充了。
    如果你有疑惑或者问题,请及时提出。一是为了让自己学的更加明白,二是可能我解释不到位,所以造成理解困难。你提出来后,我就可以解释的更加清楚,也就促使你学的更加轻松明白。对于消息机制的部分,我们在后面还会详细解释。窗口和消息机制就是Windows编程的核心,我们就是研究这些东西。请耐心学习。