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。

MFC中模态对话框和非模态对话框,布布扣,bubuko.com

时间: 2024-10-06 19:06:43

MFC中模态对话框和非模态对话框的相关文章

MFC中模态对话框和非模态对话框的区别

在MFC中有模态对话框和非模态对话框,那这两种有什么区别呢.又都是用于什么场合呢. 首先,要弄清楚2种对话框是如何创建的. 然后要弄清楚2种对话框有什么区别,可能从表面上看,模态会阻塞主对话框,可原理是什么呢. 还有就是,当有模态和非模态对话框没有关闭的时候,在任务栏中,关闭主窗体,会有什么样的效果呢. 虽然,现在有很多优秀的开源库比如QT,DUI等,但是这些原理,我们还是要了解的,不能停留在用的层面.有人说MFC过时了,有人说,现在有很多开源库,知道怎么用就可以了.但是现在界面要的交互好,界面

VS2010/MFC对话框:非模态对话框的创建及显示

非模态对话框的创建及显示 上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将上一讲中创建的Tip模态对话框改为非模态对话框,让大家看下效果. 非模态对话框的对话框资源和对话框类 实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,所以上一讲中创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改. 创建及显示非模态

MFC模态对话框与非模态对话框的区别

对话框主要分为两个类型:模式对话框和非模式对话框. 1.模式对话框的特点是: a)在关闭模式对话框前,无法操作背景窗口,除非自身就是主窗口: b)使用CDialog::DoModal函数弹出模式对话框,该函数执行过程是阻塞函数: c)因此在栈内或者堆内申请对话框类的对象都可以的,申请栈内变量开发和运行效率高一些. 2.非模式对话框的特点是: a)在非模式对话框运行时可以操作背景窗口: b)使用CDialog::Create函数和CWnd::ShowWindow弹出模式对话框,该函数执行过程是非阻

MFC 模态对话框与非模态对话框

1 1 模态对话框与非模态对话框 2 //1 3 CChatDlg *pChatDlg = new CChatDlg; //pChatDlg会被释放 4 if (FALSE == pChatDlg->Create(IDD_CHAT_DLG, this)) 5 { 6 return; 7 } 8 pChatDlg->ShowWindow(SW_SHOW); //不show看不到的 9 10 //2 再次点击不能用了 11 12 CChatDlg pChatDlg; //.h 13 if (FAL

模态对话框与非模态对话框

①.区别 模态对话框:创建后,程序的其他窗口便不能进行操作,必须将该窗口关闭后,其他窗口才能进行操作.------父线程阻塞,子线程运行 非模态对话框:无需像模态对话框那样,它不强制要求用户立即反应,而是与其他窗口同时接受用户操作.-----父子线程同时运行 ②.添加资源与类绑定 资源窗口添加Dlg资源,Dlg窗口右键Add Class 绑定类.选择继承类 CDialog. ②.对话框创建与显示 模态对话框:CDialog::DoModal CMyDialog dlg;//继承CDialog类的

VC++模态对话框和非模态对话框

MFC中有两种类型的对话框:模态对话框和非模态对话框. 模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务.非模态对话框是指当其显示时,允许转而执行程序中其他任务,而不用关闭这个对话框. 模态对话框的创建:创建模态对话框需要调用CDialog类的成员函数:DoModal,该函数的功能是创建并显示一个模态对话框,其返回值将作为CDialog类的另一个成员函数:EndDialog的参数,后者的功能是关闭模态对话框.一般显示模态对话框的实现代码如下: voi

QT笔记之模态对话框及非模态对话框

模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等.所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭.对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互. 在Qt中,显示一个对话框一般有两种方式,一种是使用exec()方法,它总是以模态来显示对话框:另一种是使用show()方法

骆驼命名法和模态对话框与非模态的对话框

骆驼式命名法(Camel-Case)又称驼峰命名法,是电脑程式编写时的一套命名规则(惯例).正如它的名称CamelCase所表示的那样,是指混合使用大小写字母来构成变量和函数的名字.程序员们为了自己的代码能更容易的在同行之间交流,所以多采取统一的可读性比较好的命名方式. 有些程序员喜欢全部小写,有些程序员喜欢用下划线,所以如果要写一个my name的变量,他们常用的写法会有myname.my_name.MyName或者myName.这样的命名规则不适合所有程序员阅读,而利用驼峰命名法来表示,可以

QT模态对话框及非模态对话框

QT模态对话框及非模态对话框 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等.所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭.对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互. 在Qt中,显示一个对话框一般有两种方式,一种是使用exec()方法,它总是以模态来显示对话框