欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

模态与非模态对话框

程序员文章站 2022-07-14 11:26:06
...

功能上区别:
模态对话框运行时,关闭本对话框之前,用户无法对本程序的其他部分进行操作。
而非模态对话框打开同时还可以切换到其他窗口进行操作。

编程实现区别:
模态对话框使用CDialog::DoModal函数来创建,DoModal会启动一个模态对话框自己的消息循环,这也是模态对话框要关闭后才能使用程序其他窗口的原因。DoModal函数在对话框关闭后才返回。
非模态对话框使用CDialog::Creat函数实现,由于Creat函数不好启动新的消息循环,对话框与应用程序共用一个消息循环,因此就不好独占用户输入。

编程实例
(1)新建一个基于对话框的MFC应用程序ModalModelessTest,删除对话框中原有控件。
(2)添加一个按钮,标题是“显示模态对话框”。
(3)插入一个新Dialog,把ID改为“IDD_MODEL”,Caption属性改为“模态对话框”,把新建的对话框上的控件都删除,然后为其添加一个类“CDlgModel”,基类选择“CDialog”。
(4)打开“IDD_MODALMODELESSTEST_DIALOG”对话框,对“显示模态对话框”按钮双击添加消息处理函数,代码如下:

void CModalModelessTestDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	CDlgModel dlg;
	dlg.DoModal(); //创建并显示模态对话框
}

(5)在ModalModelessTest.cpp的开头添加包含文件:

#include "DlgModel.h"

(6)保存工程并运行。
模态与非模态对话框
(7)打开“IDD_MODALMODELESSTEST_DIALOG”对话框,添加一个按钮,标题是“显示非模态对话框”。
(8)再插入一个新Dialog,把ID改为“IDD_MODELESS”,Caption属性改为“非模态对话框”,把新建的对话框上的控件都删除,然后为其添加一个类“CDlgModeless”,基类选择“CDialog”。
(9)在ModalModelessTest.cpp的开头添加包含文件:

#include "DlgModeless.h"

并定义一个全局变量:

CDlgModeless *g_dlgModeless = NULL; 

(10)打开“IDD_MODALMODELESSTEST_DIALOG”对话框,对“显示非模态对话框”按钮双击添加消息处理函数,代码如下:

void CModalModelessTestDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	if (!g_dlgModeless)	//如果非模态对话框对象还没创建则新建
	{
		g_dlgModeless = new CDlgModeless;
		g_dlgModeless->Create(CDlgModeless::IDD, this); //创建非模态对话框

	}
	g_dlgModeless->ShowWindow(SW_SHOW); //显示非模态对话框
	g_dlgModeless->SetActiveWindow(); 
}

(11)切换到类视图,右击CDlgModeless,选择属性,“重写”OnOK和OnCancel函数,代码如下:

void CDlgModeless::OnOK()
{
	// TODO: 在此添加专用代码和/或调用基类

	CDialog::OnOK();
	DestroyWindow(); //销毁窗口,会发出WM_DESTROY消息
}


void CDlgModeless::OnCancel()
{
	// TODO: 在此添加专用代码和/或调用基类

	CDialog::OnCancel();
	DestroyWindow(); //销毁窗口,会发出WM_DESTROY消息
}

(12)切换到类视图,右击CDlgModeless,选择属性,在消息页面中添加“WM_DESTROY”的响应函数OnDestroy,代码如下:

void CDlgModeless::OnDestroy()
{
	CDialog::OnDestroy();

	// TODO: 在此处添加消息处理程序代码
	delete this;
	g_dlgModeless = NULL;
}

(13)在DlgModeless.cpp的开头添加全局变量的引用:

extern CDlgModeless *g_dlgModeless;

(14)保存工程并运行,结果如下图:
模态与非模态对话框