MFC的对话框非为两种,一种叫模态对话框(Modal Dialog Box,又叫做模式对话框),一种叫做非模式对话框(Modaless Dialog Box,又叫无模式对话框)。两者的区别在于当对话框打开的时候,是否允许用户进行其他对象的操作。
一、模态对话框
模态对话框指,当用户需要对该对话框之外的其他对话框或者模块进行操作时,必须该对话框关闭,才能去编辑其他对话框或者模块。
创建如下:
//创建模态对话框
CModalDialog modalDialog;
modalDialog.DoModal();
如上例子中modalDialog为一个对话框的对象,模态和非模态的主要区别就是在DoModal上,当程序执行到DoModal的时候,它会告诉程序,当前只能执行只能执行当前对话框的操作,别的操作暂时停止。直到当前对话框关闭后,才执行完DoModal,结束当前对话框的操作。
二、非模态对话框
非模态对话框指,当用户打开非模态对话框时,依然可以操作其他窗口。例如,Windows提供的记事本程序中的【查找】对话框。【查找】对话框不会垄断用户的输入,打开【查找】对话框后,仍可与其他用户界面对象进行交互。用户可以一边查找,一边修改文章,这样就大大方便了使用。
要建立非模态对话框需要调用两个函数Create()和ShowWindow(),并且在结束当前对话框的时候需通过DestroyWindow()来强制销毁创建的对话框。
如下这种情况是否可行?
<pre name="code" class="cpp"> void CYourView::OnOpenDlg(void)
{
/*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/
CModalessDialog modalessDialog;
modalessDialog.Create(IDD_TEST_DLG);
modalessDialog.ShowWindow(SW_SHOW);
}
在运行时,你会发现此对话框无法显示。这是因为你声明的对话框变量
modalessDialog
是局部变量,但这个函数返回时,modalessDialog也被析构了,所以 无法显示此对话框。
void CYourView::OnOpenDlg(void)
{
/*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/
CModalessDialog* modalessDialog = new CModalessDialog;
modalessDialog->Create(IDD_TEST_DLG)
modalessDialog->ShowWindow(SW_SHOW);
//切记不要delete modalessDialog,防止结束对象。
}
由于没有定义的对象一直没有delete,所以其一直存在,知道程序结束,所以该对话框一直显示,但是属于一个指针来说,不去释放其内存,会造成不必要的 错误,所以一般可以讲该对象定义成为一个成员变成,可以在析构函数中释放其申请的内存。
对于何时去销毁创建的对话框,这个可以有用户自己去决定,例如我们可以选在在点击关闭按钮之后,在OnClose()函数中去强制关闭该对话框。如下:
void CYourView::OnCancel()
{
CDialog::OnCancel();
DestroyWindow();
}
如上就可以强制关闭对话框。
END。