一般来说,Windows应用程序中,对话框分为模态对话框和非模态对话框两种。
- 模态对话框(
Modal Dialogue Box
,又叫做模式对话框)垄断了用户的输入。当一个模态对话框打开时,用户只能与该对话框进行交互,而其他用户界面对象收不到输入信息。模态对话框下,用户需要操作其他对话框就必须先关闭模态对话框。 - 非模态对话框(
Nonmodal Dialogue Box
,又叫做无模式对话框),与模态对话框不同,当用户打开非模态对话框时,依然可以操作其他窗口。
模态对话框
创建模态对话框的代码:
//创建一个模态对话框
CMyDialog dlg;
//如果通过点击OK按钮来关闭对话框
if (dlg.DoModal() == IDOK){ //直到对话框被关闭时,DoModal()函数才返回
//Do something awesome
}
其中CMyDialog
为自己创建的和一个对话框资源相关联的对话框类。
非模态对话框
要建立非模态对话框需要调用两个函数Create()
和ShowWindow()
,若和上面一样的方式创建一个非模态对话框:
CMyDialog td;
td.Create(IDD_DIALOG); //创建一个非模态对话框
td.ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
那么,在运行时,你会发现此对话框无法显示。这是因为你声明的对话框变量td
是局部变量,但这个函数返回时,td也被销毁了,所以无法显示此对话框。
创建非模态对话框,必须在堆上申请空间(因为如果不加干预的话,堆空间的生存期与程序的生存期相同);也就是说必须声明一个指向CMyDialog
类的指针变量,且需要显示的时候,调用ShowWindow()
才能将对话框显示出来。
有两种创建方法:
-
采用局部变量创建一个非模态对话框
//采用局部变量创建一个非模态对话框 CTestDialog *pTD = new CTestDialog(); pTD->Create(IDD_DIALOG1); //创建一个非模态对话框 pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
这种方法虽然不影响程序的运行,可是指针
pTD
在函数结束时即被销毁,其所指向的内存也不可用,这样的编程很不好。 -
采用成员变量创建一个非模态对话框
首先在你所要编写的类的头文件中声明一个指针变量:private: CTestDialog *pTD;
然后再在相应的CPP文件,在你要创建对话框的位置添加如下代码:
//采用成员变量创建一个非模态对话框 pTD = new CTestDialog(); //给指针分配内存 pTD->Create(IDD_DIALOG1); //创建一个非模态对话框 pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
最后在所在类的析构函数中收回pTD所指向的内存:
delete pTD;