[转载]模态窗口的消息机制解析

        VC书上说,主窗口创建模态窗口后,模态窗口能接收用户输入而主窗口不行,但是同时,主窗口还能接收程序发送出来的消息。模态窗口退出后,主窗口的模态窗口后面的代码能够继续执行。
        这里就产生了一个矛盾,主线程有没有被模态窗口阻塞?如果被阻塞了的话,为什么主窗口还能响应其他消息?如果没有被阻塞,那么为什么模态窗口退出后能够继续执行接下来的代码?

        通过查资料和请教xz,终于搞清楚了这个奇怪的问题。
        首先,模态窗口和主窗口是共用一个消息线程的,也就是说,两个窗口的消息循环都运行在主线程中,但是,它们各自都有自己的消息循环。与模态窗口不同,非模态窗口就和主窗口共用消息消息循环。所以我们看到,模态窗口和非模态窗口都是没有创建新线程的。
        我们知道,DispatchMessage函数是用来处理消息的,当民工在主窗口的某个消息响应函数里面创建了模态窗口并显示时,实际上是在DispatchMessage里面做的,这时候,相对于主线程来说,如果模态窗口不结束,这一次的DispatchMessage是没有结束的!这样在模态窗口退出的时候,程序才能接着执行下面的代码。
         那么,这个DispatchMessage函数在显示模态窗口之后一直在干啥呢?答案是,一直在执行模态窗口的消息循环,也就是GetMessage和DispatchMessage不停被执行。这个消息循环和主窗口的消息循环有什么区别么?答案是:完全没有区别!这个问题迷惑了我好久,后来xz一句话就点透了:你看DispatchMessage函数的参数里面都是不带窗口句柄的!也就是说DispatchMessage函数在分发消息执行响应函数的时候,会执行每一个窗口的WinProc函数,这样,主窗口和模态窗口的消息循环就一模一样了。这样,主窗口也就能响应非界面用户的消息了。
         最后还有一个问题,主窗口怎么响应不了用户输入的消息呢?这是因为模态窗口在创建的时候调用了EnableWindow(hParent,FALSE),这样主窗口就不能接受用户输入了。

posted @ 2013-11-13 12:54  Jingle Guo  阅读(444)  评论(0编辑  收藏  举报