• MFC模态对话框的消息循环


    MFC模态对话框的消息循环

    单线程程序, 当主窗口响应函数中弹出模态对话框时,为什么主窗口响应函数可能照常工作?

    当弹出模态对话框时,线程的消息循环无法返回,父窗口的事件本应没人处理,应该处于卡死状态,但实事上父窗口是可以正常响应能接收到的消息的,比如计时器传来的WM_TIMER 及系统托盘菜单传回来的WM_COMMAND。

    之前的消息循环无法返回是正确的,但模态对话框并不意味着死循环,实事上,它在做另一个消息循环。

    AfxInternalPumpMessage() 里面就是一个消息泵,包括消息的获取与分发:


    只要有消息循环存在线程内的所有窗口就会活过来。不管弹出多少个模态对话框,线程内始终有一个消息循环为所以的窗口服务。

    但这种形式带来的那一个问题就是,如何关闭所有模态对话框并退出程序?

    如果简单地有EndDialog来关闭对话框,是无法让所有的消息循环返回的。有一种做法是使用PostQuitMessage,使当前的消息循环退出,消息循环收到WM_QUIT后,不当退出本次循环,还会给线程消息队列Post另一个QUIT 消息,这样消息循环就接二连三挨个退出了。

    int CWnd::RunModalLoop(DWORD dwFlags)中的代码片段可以说明这点:


  • 相关阅读:
    什么是马甲APP?怎么用马甲APP导流
    OC与JS交互前言-b
    UIWebView1-b
    Mac双系统切换
    iOS之手势滑动返回功能
    Duplicate Symbol链接错的原因总结和解决方法-b
    #ifndef#define#endif的用法-b
    iOS Copy 和 MutableCopy的区别 深浅拷贝的区别-供参考
    解决CocoaPods在OS X 10.11出现问题-b
    django中cookies和session
  • 原文地址:https://www.cnblogs.com/riskyer/p/3304053.html
Copyright © 2020-2023  润新知