对话框的种类

有两种类型的对话框:模态( Modal)对话框和非模态( Modeless)对话框

  • 模态对话框

模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务。例如,在Word中利用【文件打开】菜单命令显示一个“打开”对话框后,再用鼠标去选择其他菜单,或者进行该对话框以外的任何操作时,只会听到嘟嘟声,这是因为“打开”对话框是一个模态对话框。模态对话框垄断了用户的输入,当模态对话框打开时,用户只能与该对话框进行交互,而其他用户界面对象接收不到输入信息。我们平时所遇到的大部分对话框都是模态对话框。

  • 非模态对话框

当非模态对话框显示时,允许转而执行程序中其他任务,而不用关闭这个对话框。典型的例子是 Windows提供的记事本程序中的“查找”对话框,该对话框不会垄断用户的输入,打开“査找”对话框后,仍可以与其他用户界面对象进行交互,用户可以一边查找,一边修改文章,这样,就大大方便了使用

总结:简单说就是模态对话框显示时不能进行其他操作,而非模态对话框显示时可以对其他界面进行操作

创建:

首先插入一个对话框:如图所示点击插入(Insert),再点击资源(Resource),选择Dialog,或者在资源视图右击点击插入(Insert Dialog)

在MFC中,对资源的操作通常都是通过一个与资源相芙的类来完成的。对话框资源也有一个相应的基类: CDialog.

根据MSDN提供的帮助信息,可以知道 CDialog类派生于CWnd类,所以它是一个与窗口相关的类,主要用来在屏幕上显示一个对话框。由此可知,实际上,对话框本身也是一个窗口界面。既然在MFC中,对资源的操作是通过一个类来完成的,那么就需要创建一个类与这个新建的对话框资源相关联。为此,在ⅤC++开发环境中,选择【view】菜单下的【 Class Wizard】菜单命令,这时会弹出对话框,提示ID: IDD DIALOG1资源是一个新资源,并且因为它是一个对话框资源,所以需要为它创建一个相关联的类,或者可以选择程序中已有的一个类与之相关联。单击【OK】按钮,然后弹出一个对话框利用这个对话框就可以为新建的对话框资源创建一个关联的类,,然后取一个名字,例:CTestDlg.

如何调用与显示对话框:

对于模态对话框:      例:点击按钮弹出一个模态对话框

首先拖入按钮控件,双击按钮,添加响应函数,在函数中敲下如下代码(在这之前要先添加对应对话框类的头文件TestDlg.h)

void CTestDlg::OnButton1()
{// TODO: Add your control notification handler code hereCTestDlg dlg;dlg.DoModal();
}

编译运行:   点击Button1按钮,显示为图二

      

在创建模态对话框时,当执行到调用 DoModal函数以显示这个对话框时,程序就会暂停执行,直到模态对话框关闭之后,程序才继续向下执行。也就是说,当模态对话框显示时,程序中创建的dlg这个对象的生命周期并未结束。因此,在创建非模态对话框时,不能把对话框对象定义为局部对象。对于这个问题,有两种解决办法:一种就是把这个对话框对象定义为类的成员变量;另一种方式是将它定义为指针,在堆上分配内存。我们知道,在堆上分配的内存,与程序的整个生命周期是一致的,当然这里是指程序中不主动销毁的情况这里,我们采用后一种方式

对于非模态对话框:     例:点击按钮弹出一个非模态对话框

void CModleDlg::OnButton1()
{// TODO: Add your control notification handler code here
//  CTestDlg dlg;
//  dlg.DoModal();CTestDlg* pDlg = new CTestDlg;pDlg->Create(IDD_DIALOG1,this);    //创建对话框pDlg->ShowWindow(SW_SHOW);    //显示对话框
}

可是,上例所示的这段程序仍有问题,首先,我们定义的pDlg这个指针变量是个局部对象,这样当它的生命周期结束时,它所保存的内存地址就丢失了,那么在程序中也就无法再引用到它所指向的那块内存了。这个问题的解决办法有两种:一是将这个指针变量定义为类的成员变量,然后在 CMybole View类的析构函数中调用 delete函数来释放这个指针变量所指向的那块内存;二是在 CTestDlg类中重载PostNcDestroy虚函数,释放this指针所指向的内存。

C++ MFC深入详解之----模态对话框与非模态对话框相关推荐

  1. 详解Linux交互式shell脚本中创建对话框实例教程

    详解Linux交互式shell脚本中创建对话框实例教程 本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一 ...

  2. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

  3. MFC中模态对话框和非模态对话框的差别

    在MFC中有模态对话框和非模态对话框,那这两种有什么差别呢. 又都是用于什么场合呢. 首先,要弄清楚2种对话框是怎样创建的. 然后要弄清楚2种对话框有什么差别,可能从表面上看,模态会堵塞主对话框.可原 ...

  4. MFC创建模态对话框与非模态对话框 执行顺序

    创建模态对话框 CDialog::DoModal virtual int DoModal(); 返回值: 整数值,指定了传递给CDialog::EndDialog 的nResult参数值.该函数用于关 ...

  5. MFC模态对话框和非模态对话框

    下面是一个我的手写的模态对话框和非模态对话框图: 模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务.非模态对话框是指当其显示时,允许转而执行程序中其他任务 ...

  6. MFC中的模态对话框与非模态对话框的消息循环及消息传递问题(都可以通过SendMessage传递消息)

    注意:非模态和模态对话框都有自己的消息响应过程函数WindowPro,只不过他们的调用模态是自己的消息泵,非模态是由父窗体或父窗体的上一级的消息泵来调用.模态对话框和非模态对话框都可以通过SendMe ...

  7. [MFC]模态对话框与非模态对话框

    MFC中有两种类型的对话框: 模态 对话框和非模态 对话框. 模态 对话框是指当其显示时,程序会暂停执行,直到关闭这个 模态 对话框后,才能继续执行程序中其他任务. (如我们常见的"打开文件 ...

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

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

  9. MFC模态窗口与非模态窗口

    MFC模态窗口与非模态窗口 开发工具与关键技术:C++.VisualStudio 作者:何任贤 撰写时间:2019年07月25日 模态窗口的意思是指主窗口在打开模态窗口后,没法再操作主窗口,这就是模态 ...

最新文章

  1. 在线学html5,HTML5 在线学习自我演进的导弹系统
  2. caffe-win10-cifar10另
  3. Spring中@Controller和@RestController之间的区别
  4. STM32F103中文参考手册之时钟树
  5. java车次信息_从火车站车次公示栏来学Java读写锁
  6. 国庆假期带动新能源汽车消费热潮
  7. 【Java】JavaSE JDK 及离线帮助文档下载链接
  8. Android Studio一键汉化,分享一个自己写的小工具
  9. iOS -- tableView截取长图 或者 UIScrollView截取长图 (Swift代码)
  10. 前后端分离 获取客户端ip_前后端分离交互
  11. DSI3协议理论基础讲解
  12. GrassCutter使用教程
  13. 理解浏览器的历史记录
  14. java 读取本地配置文件 Properties
  15. r1音箱原生系统更改服务器,低门槛不破坏R1功能改AUX音源电脑喇叭[已更新完整]...
  16. 通过CSS样式缩放图片导致图片模糊的解决方案
  17. 什么软件可以支持图片转语音?
  18. 转载CSDN博客步骤
  19. python基础知识整理一
  20. 估值调整 - Quanto 调整

热门文章

  1. 控制三色LED灯的闪烁——Arduino
  2. 2、这是一张单纯的图片
  3. select max
  4. ubuntu18.04上安装anaconda-python深度学习环境
  5. ​​Navicat设定mysql定时任务!
  6. 八、kubernetes Pod控制器
  7. Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问 本地证书过期处理
  8. 快速学习-在线人数统计
  9. Python爬虫获取数据保存到数据库中(超级详细,保证一看就会)
  10. 基于PI双闭环解耦控制的三相SVPWM电压型逆变器(3)--调制方法