特点:

模式对话框(modal dialog box模态对话框):在关闭模式对话框之前,程序不能进行其他工作(如一般的“打开文件”对话框) 阻塞
无模式对话框(modeless dialog box 非模态对话框):模式对话框打开后,程序仍然能够进行其他工作(如一般的“查找与替换”对话框) 非阻塞

区别: 

一. 非模态对话框的模板必须具有Visible风格(Visible=True),否则对话框将不可见,而模态对话框则无需设置该项风格。在实际编程中更加保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。

二. 非模态对话框对象是用new操作符来动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建的。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。

三. 通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是两者之间区别的关键所在。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户输入。Create在显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆栈中构建对话框对象,而不能以局部变量的形式来构建之。

四. 必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。调用CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用DestroyWindow来关闭对话框。

五. 因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符删除对话框对象。在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作,具体代码如下 ,清理非模态对话框的内存

void CModelessDialog::PostNcDestroy
{delete this;    //删除对象} 

这样,在删除屏幕上的对话框后,对话框对象将被自动删除。拥有者就不必显式地调用delete来删除对话框对象了。

六. 必须有一个标志表明非模态对话框是否打开的。这样做的原因是用户有可能在打开一个模态对话框的情况下,又一次选择打开命令。程序根据标志来决定是打开一个新的对话框,还是仅仅把原来打开的对话框激活。通常可以用拥有者窗口中的指向对话框对象的指针作为这种标志,当对话框关闭时,给该指针赋NULL值,以表明对话框对象已不存在了。

创建模态对话框
CTestDlg dlg;
dlg.DoModal();
创建非模态对话框
CTestDlg * dlg = new CTestDlg;
dlg->Create(IDD_TEST_DLG);
dlg->ShowWindow(SW_SHOW); 

在WIN32中,模式对话框的创建一般是使用DialogBox来进行创建的。而非模式对话框则是利用CreateWindow来创建的。在MFC或是WTL中,模式对话框一般是使用DoModal,而非模式对话框的创建则是使用Create。模式对话框创建后,程序的其他窗口便不能进行操作,必须将该窗口关闭后,其他窗口才能进行操作。而非模式对话框则无需这样,它不强制要求用户立即反应,而是与其他窗口同时接受用户操作。

模态对话框与非模态对话框的区别 1相关推荐

  1. 模态对话框与非模态对话框的区别

    最近几天一直在研究这个问题,起初一直都是在用模态对话框,然而在一个对话框中打开另外一个模态对话框时,一直都无法将值传递给该模态对话框,今天早上将模态对话框改成了非模态对话框,问题竟然解决了.于是决定将 ...

  2. 模态对话框和非模态对话框的区别

    模态对话框和非模态对话框的区别 假设对话框类名为:CTestDlg  1,如果是模态对话框: CTestDlg ctd;//创建该对话框对像  ctd.DoModale(); 2,如果是非模态的: C ...

  3. PyQt5 模态对话框与非模态对话框的区别

    模态对话框与非模态对话框的区别 记录博文 一.模态对话框 应用程序模态对话框:一旦调用该对话框,它就会成为应用程序唯一能够与用户进行交互的部件.在关闭该对话框之前,用户都不能使用应用程序的其他部件.当 ...

  4. 模态对话框 和 非模态对话框的区别

    模态对话框 出现模态对话框时,主窗口或其他这个程序的窗口将无法进行操作,要等到模态对话框退出才可以操作这个程序的其他窗口. (确保一对一进行反馈) 例如:每次关闭程序时都会弹出的窗口:"1. ...

  5. c#中的模态对话框和非模态对话框

    模态对话框 弹出窗口阻止调用窗口的所有消息响应. 只有在弹出窗口结束后调用窗口才能继续. 在模态窗口"关闭"后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值. 非模态 ...

  6. 模态对话框和非模态对话框的消息循环分析

    1.非模态对话框和父窗口共享当前线程的消息循环 2.模态对话框新建一个新的消息循环,并由当前消息循环派发消息,而父窗口.模态对话框屏蔽了用户对它父窗口的操作,但是不是在消息循环里面屏蔽,所以给父窗口发 ...

  7. Qt中的模态对话框和非模态对话框

    模态对话框及非模态对话框(详情见课本P51). 模态对话框:在没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭. 非模态对话框:当被打开时,用户既可选择和该对话框进行交互, ...

  8. 简记模态对话框和非模态对话框

    模态对话框和非模态对话框的区别 模态对话框会阻止与其它窗口的交互,而非模态对话框不会.即模态对话框显示的时候,不能操作其它窗口,要想操作其它窗口,必须关闭该模态对话框:非模态对话框显示的时候,可以对其 ...

  9. vc++开发学习二(模态对话框和非模态对话框的创建和销毁)

    ①.模态对话框与非模态对话框的区别: 模态对话框:一旦创建模态对话框,则无法操作父对话框,只能操作当前创建的模态对话框,关闭当前模态对话框后才可以操作父对话框非模态对话框:和模态对话框相反,创建该对话 ...

  10. MFC应用模态对话框和非模态对话框

    关于对话框呢 第一个了解的就是模态对话框和非模态对话框 定义的话: 1.模态对话框工作状态:当它获得焦点时,将垄断用户的输入,在完成本对话框之前,用户无法对本程序的其他部分进行操作. 2.非模态对话框 ...

最新文章

  1. svn错误 is already locked 解决方案
  2. Ubuntu18.04安装Multiwfn
  3. 实现用户名密码登陆,输入错误3次后锁定用户
  4. 什么是javax.ws.rs.core.context? [ 第1部分 ]
  5. 原DTCoreText学习(三)-自定义DTAttributedTextCell
  6. w25q64 linux,W25Q64Flash芯片STM32操作
  7. 汇编笔记1:debug
  8. 中划线与下划线的区别
  9. Drools5.0.1使用excel实例
  10. 华硕fx60vm拆机图解_飞行堡垒fx60vm怎么样 华硕飞行堡垒FX60VM全面深度评测图解...
  11. 初次安装RedFlag5+Oracle
  12. 网上外卖及订餐系统的数据库设计
  13. char 类型用“+”号连接
  14. 位、字节、字、双字、字长
  15. 又附体了!黄健翔的确没有错!(ZZ)
  16. 《数据仓库》一文读懂数据仓库建设
  17. FS4033泛海微原厂5V输入升压7.2V给两串磷酸铁锂电池充电IC
  18. Panel Designer教程
  19. 营业税与增值税的区别有哪些?
  20. 英语口语8000句(7)

热门文章

  1. 拿到月薪20k的前端工程师简历是什么样的?
  2. 软件系统架构评估方法SAAM 介绍
  3. 国外APP外包开发及上线流程
  4. Python输入一个字符串,有多少个数字,多少个字母,又有多少个其它字符?
  5. 简支梁挠度计算公式推导_结构力学简支梁跨中挠度计算公式
  6. 计算机网络的核心技术,计算机网络技术的核心技术领域应用分析
  7. 世界时间(卡西欧电波表24个城市缩写翻译及简介)
  8. AI产品经理必懂5种技术关系
  9. 解决办法:无法从本地电脑复制文件到远程服务器中
  10. python修改docx文档的表格内中文字体