MFC模态对话框的消息循环
2013-09-05 16:45
211 查看
MFC模态对话框的消息循环
单线程程序, 当主窗口响应函数中弹出模态对话框时,为什么主窗口响应函数可能照常工作?
当弹出模态对话框时,线程的消息循环无法返回,父窗口的事件本应没人处理,应该处于卡死状态,但实事上父窗口是可以正常响应能接收到的消息的,比如计时器传来的WM_TIMER 及系统托盘菜单传回来的WM_COMMAND。
之前的消息循环无法返回是正确的,但模态对话框并不意味着死循环,实事上,它在做另一个消息循环。
AfxInternalPumpMessage() 里面就是一个消息泵,包括消息的获取与分发:
只要有消息循环存在线程内的所有窗口就会活过来。不管弹出多少个模态对话框,线程内始终有一个消息循环为所以的窗口服务。
但这种形式带来的那一个问题就是,如何关闭所有模态对话框并退出程序?
如果简单地有EndDialog来关闭对话框,是无法让所有的消息循环返回的。有一种做法是使用PostQuitMessage,使当前的消息循环退出,消息循环收到WM_QUIT后,不当退出本次循环,还会给线程消息队列Post另一个QUIT 消息,这样消息循环就接二连三挨个退出了。
int CWnd::RunModalLoop(DWORD dwFlags)中的代码片段可以说明这点:
单线程程序, 当主窗口响应函数中弹出模态对话框时,为什么主窗口响应函数可能照常工作?
当弹出模态对话框时,线程的消息循环无法返回,父窗口的事件本应没人处理,应该处于卡死状态,但实事上父窗口是可以正常响应能接收到的消息的,比如计时器传来的WM_TIMER 及系统托盘菜单传回来的WM_COMMAND。
之前的消息循环无法返回是正确的,但模态对话框并不意味着死循环,实事上,它在做另一个消息循环。
AfxInternalPumpMessage() 里面就是一个消息泵,包括消息的获取与分发:
只要有消息循环存在线程内的所有窗口就会活过来。不管弹出多少个模态对话框,线程内始终有一个消息循环为所以的窗口服务。
但这种形式带来的那一个问题就是,如何关闭所有模态对话框并退出程序?
如果简单地有EndDialog来关闭对话框,是无法让所有的消息循环返回的。有一种做法是使用PostQuitMessage,使当前的消息循环退出,消息循环收到WM_QUIT后,不当退出本次循环,还会给线程消息队列Post另一个QUIT 消息,这样消息循环就接二连三挨个退出了。
int CWnd::RunModalLoop(DWORD dwFlags)中的代码片段可以说明这点:
相关文章推荐
- MFC中消息循环处理的几个函数之间的区别
- 记一次进程线程dll和MFC消息循环的系列问题
- MFC中的消息循环
- MFC消息循环
- 深入探讨MFC消息循环和消息泵
- 091019(星期一)MFC消息循环2,分解RunModalLoop
- MFC 消息循环仿真
- MFC学习小记(1) MFC的入口点与消息循环,消息映射
- MFC消息循环和消息泵
- 深入探讨MFC消息循环和消息泵
- .深入探讨MFC消息循环和消息泵
- MFC消息循环
- 深入探讨MFC消息循环和消息泵
- MFC 定时触发器实现循环给指定线程进行发送消息
- 091021(星期三)MFC线程消息循环4,Using Messages and Message Queues的msdn描述
- MFC---理解Windows消息循环机制
- 深入探讨MFC消息循环和消息泵
- MFC中消息循环处理的几个函数之间的区别
- MFC的来龙去脉-----消息循环,找处理场所
- MFC消息循环和消息泵