UpdateWindow(); if (!ContinueModal()) // reset "no idle" state after pumping "normal" message } while (::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE)); ExitModal: |
先说说怎么退出这个无限循环,在代码中:
if (!ContinueModal()) |
NOTE: CWnd::ContinueModal()函数检查对话框是否继续模式。返回TRUE,表示现在是模式的;返回FALSE,表示对话框已经不是模式(将要结束)。
如果要结束对话框,在内部最终会调用函数CWnd::EndModalLoop,它取消m_nFlags的模式标志(消息循环中的ContinueModal函数将返回FALSE,消息循环将结束,程序将退出);然后激发消息循环读取消息。也就是说,结束模式对话框是一个标志,改变这个标志就可以了。他的代码是:
//wincore.cpp // this result will be returned from CWnd::RunModalLoop // make sure a message goes through to exit the modal loop |
NOTE: PostMessage(NULL)是有用的。如果消息队列中没有消息的话,可能消息循环中的ContinueModal()不会马上执行,发送一个空消息是激发消息循环马上工作。
下面说一下CWnd::RunModalLoop函数中的消息循环究竟干了些什么事情:
1,第一个内循环。首先从消息队列中查询消息,如果对话框空闲,而且消息队列中没有消息,他做三件事情,大家应到都能从字面上明白什么意思。最重要的是发送WM_KICKIDLE消息。为什么呢?第一部分讲到了,非对话框程序用OnIdle来更新用户界面(UI),比如工具栏,状态栏。那么,如果对话框中也有工具栏和状态栏呢,在哪里更新(网上有很多这样的程序)?可以处理WM_KICKIDLE消息:
进入讨论组讨论。
相关专题
- (77453次浏览)Google在线翻译--请输入要翻译的内容
- (17689次浏览)VC++动态链接库(DLL)编程深入浅出(二)
- (15190次浏览)VC++动态链接库(DLL)编程深入浅出(一)
- (11324次浏览)VC++动态链接库(DLL)编程深入浅出(三)
- (8316次浏览)VC6.0中使用ADO操作Access数据库
- (6018次浏览)VC下ADO开发实践之一
- (6006次浏览)使用SDL打造游戏世界之入门篇
- (5243次浏览)细谈VC程序调试的若干方法
- (5103次浏览)让你的软件界面更漂亮 [VC][二]
- (4380次浏览)深入浅出VC++串口编程之基于控件



