C++ MFC深入详解之----模态对话框与非模态对话框

对话框的种类


有两种类型的对话框:模态( Modal)对话框和非模态( Modeless)对话框

  • 模态对话框

模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务。例如,在Word中利用【文件打开】菜单命令显示一个“打开”对话框后,再用鼠标去选择其他菜单,或者进行该对话框以外的任何操作时,只会听到嘟嘟声,这是因为“打开”对话框是一个模态对话框。模态对话框垄断了用户的输入,当模态对话框打开时,用户只能与该对话框进行交互,而其他用户界面对象接收不到输入信息。我们平时所遇到的大部分对话框都是模态对话框。

  • 非模态对话框

当非模态对话框显示时,允许转而执行程序中其他任务,而不用关闭这个对话框。典型的例子是 Windows提供的记事本程序中的“查找”对话框,该对话框不会垄断用户的输入,打开“査找”对话框后,仍可以与其他用户界面对象进行交互,用户可以一边查找,一边修改文章,这样,就大大方便了使用

总结:简单说就是模态对话框显示时不能进行其他操作,而非模态对话框显示时可以对其他界面进行操作

创建:

首先插入一个对话框:如图所示点击插入(Insert),再点击资源(Resource),选择Dialog,或者在资源视图右击点击插入(Insert Dialog)

在MFC中,对资源的操作通常都是通过一个与资源相芙的类来完成的。对话框资源也有一个相应的基类: CDialog.

根据MSDN提供的帮助信息,可以知道 CDialog类派生于CWnd类,所以它是一个与窗口相关的类,主要用来在屏幕上显示一个对话框。由此可知,实际上,对话框本身也是一个窗口界面。既然在MFC中,对资源的操作是通过一个类来完成的,那么就需要创建一个类与这个新建的对话框资源相关联。为此,在ⅤC++开发环境中,选择【view】菜单下的【 Class Wizard】菜单命令,这时会弹出对话框,提示ID: IDD DIALOG1资源是一个新资源,并且因为它是一个对话框资源,所以需要为它创建一个相关联的类,或者可以选择程序中已有的一个类与之相关联。单击【OK】按钮,然后弹出一个对话框利用这个对话框就可以为新建的对话框资源创建一个关联的类,,然后取一个名字,例:CTestDlg.

如何调用与显示对话框:

对于模态对话框:      例:点击按钮弹出一个模态对话框

首先拖入按钮控件,双击按钮,添加响应函数,在函数中敲下如下代码(在这之前要先添加对应对话框类的头文件TestDlg.h)

void CTestDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	CTestDlg dlg;
	dlg.DoModal();
}

编译运行:   点击Button1按钮,显示为图二

      

在创建模态对话框时,当执行到调用 DoModal函数以显示这个对话框时,程序就会暂停执行,直到模态对话框关闭之后,程序才继续向下执行。也就是说,当模态对话框显示时,程序中创建的dlg这个对象的生命周期并未结束。因此,在创建非模态对话框时,不能把对话框对象定义为局部对象。对于这个问题,有两种解决办法:一种就是把这个对话框对象定义为类的成员变量;另一种方式是将它定义为指针,在堆上分配内存。我们知道,在堆上分配的内存,与程序的整个生命周期是一致的,当然这里是指程序中不主动销毁的情况这里,我们采用后一种方式

对于非模态对话框:     例:点击按钮弹出一个非模态对话框

void CModleDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
//	CTestDlg dlg;
//	dlg.DoModal();
	CTestDlg* pDlg = new CTestDlg;
	pDlg->Create(IDD_DIALOG1,this);    //创建对话框
	pDlg->ShowWindow(SW_SHOW);    //显示对话框
}

可是,上例所示的这段程序仍有问题,首先,我们定义的pDlg这个指针变量是个局部对象,这样当它的生命周期结束时,它所保存的内存地址就丢失了,那么在程序中也就无法再引用到它所指向的那块内存了。这个问题的解决办法有两种:一是将这个指针变量定义为类的成员变量,然后在 CMybole View类的析构函数中调用 delete函数来释放这个指针变量所指向的那块内存;二是在 CTestDlg类中重载PostNcDestroy虚函数,释放this指针所指向的内存。

发布了114 篇原创文章 · 获赞 120 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/alzzw/article/details/103629509