按工作方式不同,可将对话框分成两类: 
??模式对话框(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);

模态对话框和非模态对话框区别相关推荐

  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. 金审系统与SAP接口
  2. 运维工具SaltStack
  3. 虚拟机ubuntu启动代码界面_Windows10下使用虚拟机安装Ubuntu18.04
  4. 一个程序员的奋斗经历1
  5. 什么是HLS(HTTP Live Streaming)?
  6. java 泛型调用方法调用_java – 如何使用泛型调用最具体的方法?
  7. python合并pdf 加书签_Python生成pdf目录书签的实例方法
  8. ubuntu10.04+hadoop0.20.2平台配置(完全分布式模式)
  9. G++编译Note Pad++
  10. html有序列表序号怎么变色,html – 如何正确标记/样式有序列表以补偿大项目编号...
  11. 怎么看待传菜机器人_比拼食材原料、使用机器人传菜,餐饮业如何把握大消费时代的机遇...
  12. java赋值两个对象数组 clone_Java:类的两个相同对象数组的克隆问题
  13. Java设计模式系列之迭代器模式
  14. 【系统分析师之路】原创章节 重构与改善设计思维导图
  15. SVN clean up 报错
  16. 关于app的几个核心功能的设计想法
  17. 日语中di,ti,du,这些如何用片假名打出来
  18. android wine教程_如何在 Android 上借助 Wine 来运行 Windows Apps
  19. 磨刀不误砍柴,配置适合工作学习的桌面环境
  20. mysql数据库登录认证_MySQL数据库的用户认证系统

热门文章

  1. linux更改甜器名称,Linux添加swap分区
  2. 以下哪个不是python财经数据接口工具_这7种Python的全新玩法,大部分人都不知道!...
  3. Linux软件基础实验,linux基本操作的实验
  4. 做技术的,这些观点真的扯淡!
  5. 单片机高手必知的三个重要步骤(干货分享)
  6. php 价钱计算,php公式计算
  7. mysql查询子表的语句_MySQL基本SQL语句之单表查询、多表查询和子查询
  8. c语言中合法转义字符,判断c语言合法转义字符
  9. iphone黑屏转圈_iphone7无限转圈黑屏怎么回事?
  10. java spi机制_Java是如何实现自己的SPI机制的? JDK源码(一)