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。
MFC中模态对话框和非模态对话框,布布扣,bubuko.com