模态与非模态对话框

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

编程实现区别:
模态对话框使用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)保存工程并运行,结果如下图:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值