首页 > 代码库 > MFC中模态对话框和非模态对话框

MFC中模态对话框和非模态对话框

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。