MFC—对话框程序—模式对话框与非模式对话框

一、根据主窗口类型,MFC软件工程可以分为以下几种架构模型:

1、SDI(Single Document Interface):单文档界面,一个主框架窗口下只能编辑一份文档。

例如:记事本和画笔等。
2、MDI(Multiple Document Interface):多文档界面,一个主框架窗口下可以同时编辑多份文档。
例如:VC++6.0,Photoshop等软件。
3、基于对话框的软件模型:主窗口是通过资源管理器,在对话框模板内摆放控件编辑而成的。
多数用于开发小规模软件,例如:任务管理器。
4、其他自定义窗口做主窗口:主窗口既不是框架也不是对话框,而是直接开发通用窗口类CWnd而成。

例如:输入法窗口、QQ和360软件等,有时这类软件也都可以使用框架或对话框模式来代替开发而成。

对话框主要分为两个类型:模式对话框和非模式对话框。当模式对话框弹出后,无法操作它的父窗口或者上一级窗口,直到关闭该对话框为止。例如:大部分软件的“关于…”对话框,都是属于模式对话框。当非模式对话框弹出后,不影响对它的父窗口或者上一级窗口的操作。例如:QQ的聊天框或者编辑软件中的文字查找对话框等等。
1、模式对话框的特点是:
a)在关闭模式对话框前,无法操作背景窗口,除非自身就是主窗口;
b)使用CDialog::DoModal函数弹出模式对话框,该函数执行过程是阻塞函数; 
c)因此在栈内或者堆内申请对话框类的对象都可以的,申请栈内变量开发和运行效率高一些。
2、非模式对话框的特点是:
a)在非模式对话框运行时可以操作背景窗口;

b)使用CDialog::Create函数和CWnd::ShowWindow弹出模式对话框,该函数执行过程是非阻塞函数; 

c)不能在栈内或者堆内申请对话框类的临时对象,需要申请堆内变量或者使用全局变量、成员变量等生命期较长的对象。

类结构图:


模式对话框效果图:


非模式对话框效果图:


我在主对话框上面设置了两个button,分别弹出模式对话框和非模式对话框。

代码实现:

void CMFCDlg::OnButton1() 
{
	//模式对话框:在栈内生成一个临时变量,阻塞型对话框。DoModal产生的对话框,不能操作对话框后面的对话框
	CAboutDlg dlg;
	dlg.DoModal();
}

void CMFCDlg::OnButton2() 
{
	//非模式对话框:必须在堆内申请对象、或者在成员变量内申请对象
	CChatDlg* pDlg = new CChatDlg;
	//pDlg->Create(IDD_CHAT_DLG);//父窗口是m_pMainWnd所指定的对象
	pDlg->Create(IDD_CHAT_DLG, GetDesktopWindow());//不依赖与其他窗口,独立的窗口
	pDlg->ShowWindow(SW_SHOW);
}

猜你喜欢

转载自blog.csdn.net/huanhuanxiaoxiao/article/details/80905198