首页 MFC 基础类 更新对话款内的toolbar状态
更新对话款内的toolbar状态 PDF 打印 E-mail
用户评价: / 0
好 
MFC - 基础类
作者:Administrator   
周日, 20 7月 2008 08:35

MSDN上有篇文章,DLGCBR32 Sample,讲怎么在一个对话框中使用toolbar,并且讲解了怎样响应toolbar的update消息()。示例工程里面有个知识点,文章没有提及,就是为什么选用非模式对话框程序来演示在对话款里添加工具栏。

一般的,我们用mfc建立一个简单的对话款程序时,程序的创建就是一个对话框,然后调用它的DoModal()来显示对话框,也就是程序的主界面。这样的对话框,显然是个模式对话框,modal的。

而DLGCBR32例子,却是用Create来创建并显示对话框,显然它是modeless的。(不要写成modaless哦。)
而且在示例工程中,还有专门的类CModelessDialog来封装它。为什么要劳神写一个非模式对话框啊

这些都要从WM_IDLEUPDATECMDUI消息,OnIdle()函数和CWinThread::Run()函数说起啦。

CWinThread::Run()内有个“死循环”,不停的处理消息。在消息队列中没有消息时,就调用OnIdle,MFC框架就在其中处理一个界面更新工作,toolbar的button更新,就是在这个里面。

创建一个非模式对话框作为主界面时,消息循环由CWinThread::Run()产生,有OnIdle及WM_IDLEUPDATECMDUI消息,示例工程得以工作。

那么换作模式对话框作为主界面时,会是什么效果呢?模式对话框的消息循环,在DoModal内部,不会调用OnIdle,也就没有WM_IDLEUPDATECMDUI消息发出,toolbar自然得不到更新啦。这就是答案,msdn没有明说而已。

Modal对话款就真的不能更新里面的toolbar了吗?当然也可以,只是方法不一样,查询WM_KICKIDLE,你会发现答案~
(http://www.codeguru.com/cpp/w-d/dislog/commandui/article.php/c1911/可以作为参考,但是它是update任何control的,不是特指toolbar)