Windows下的对话框分为两类:Modal dialog boxes 和Modeless dialog boxes,即模态对话框和非模态对话框。
一、概述:MSDN里面对它们的概述分别是:
Modal dialog boxes require users to complete and close before continuing with the owner window.大概意思是,模态对话框是指当其显示后,需要用户完成该对话框的任务并关闭该模态对话框后,用户才能继续执行用户主界面窗口的任务。例如在Word里,选择“文件|打开”命令,弹出打开对话框,此时的对话框就是一个模态对话框。
Modeless dialog boxes allow users to switch between the dialog box and the owner window as desired.大概意思是,非模态对话框允许用户根据自己的需要,在用户主界面窗口和非模态对话框窗口之间进行切换。例如在Word里,选择“编辑|查找”命令,弹出“查找”对话框就是非模态的。
二、这两种对话框的创建与销毁
对于模态对话框的显示是利用对话框类的DoModal()函数实现的,调用了该函数时,就创建了一个对话框并显示。一旦模态对话框被创建并显示出来,它就进入一个 消息循环。此时模态对话框会将接收到的消息分发给需要接收此类消息并进行处理。其销毁方法只需要直接将对话框关闭就可以了,但对于又实用 new 创建的模态对话框,则需要使用 delete 将其内存对象消除。
而非模态对话框的创建需要使用CDialog类的Create()成员函数,同时需要使用对话框类的ShowWindow(SW_SHOW)来显示对话框,而不是使用DoModal()函数。同时还需要重载对话框类的 OnCancel() 和 PostNcDestroy() 成员函数,并根据所创建的对话框对象是否是使用 new操作符创建的,而在里面添加相应的销毁对话框资源的代码。一下是MSDN对非模态对话框创建与销毁的一段解释。
When you implement a modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Don’t call the base class CDialog::OnCancel, because it calls EndDialog, which will make the dialog box invisible but will not destroy it. You should also override PostNcDestroy for modeless dialog boxes in order t