先看看【Windows程序设计】的第三章:http://blog.csdn.net/zaodt/archive/2007/11/25/1901332.aspx

解决方案 »

  1.   

    Windows为当前执行的每个Windows程序维护一个「消息队列」。
    看来是一个了?
      

  2.   

    一个线程。操作系统会为每一个gui线程创建一个消息队列。为了不对非gui线程创建消息队列,所有的线程创建时的初始状态都是没有消息队列的。只有当它调用了win32 user或gui函数后,系统才会为之创建消息队列。通知消息记得不清楚了,大致的原因是在早先的OS中,子控件的绘图操作都由父窗口来完成,而现在则可以由控件自己来做。这个问题大家可以讨论一下
      

  3.   

    控件不会改变消息队列的个数, NOTIFY一般用于控件发送的消息,COMMAND则用于菜单等控件和窗口的消息交互:
    1. 用户点击窗口上面的按钮控件,windows系统发送一条消息到该窗口的消息处理循环,该消息中包含按钮控件的pWnd
    2. 消息发送到了该按钮的(如CButton类)中的消息处理函数,查看是否被处理
    3. 如果该消息没有被处理, 在MFC模式下,控件消息均被父窗口拦截,拦截利用的是subclass机制,这里设置控件的新的消息处理函数,该消息处理函数会调用父窗口的消息处理函数
    4. 父窗口中查找该消息是否在控件的消息映射表中被反射REFLECT,如果是则转到控件的消息处理函数处理。反射函数有时候会返回是否处理的一个标志,有些反射函数返回值是void,默认是已经处理了。如果在CMyButton:CButton中重载了OnNotify或者OnCommand,那么该处理函数会可能会覆盖掉这些反射处理函数,或者在OnChildNotify处理。
    5. 如果该消息没有被反射或者反射处理函数返回0,那么在父窗口中查找处理函数
      

  4.   

    一个进程可以有多个线程,一个线程可以有一个消息队列也可以没有消息队列,一般情况下当你在线程当中调用 GetMessage 的时候 OS 才会为该线程创建消息队列。我自己在作多进程通信的时候经常开一个新的线程,在线程当中独立存在一个消息循环,该线程不涉及任何窗口,与其它进程通过线程消息进行通信。对于一个单纯调用 WIN32 API 的窗口程序,一般先创建窗口然后主进程进入消息循环,在创建窗口的时候窗口函数会被调用(比如 WM_CREATE 消息),但这些是不经过消息队列直接调用的。---------------个人理解。