MFC-创建模态对话框和非模态对话框的方法

2023-05-16

注意:以下实例中创建模态对话框时没有用create(id号)绑定资源id,而非模态对话框中要用create(id号)绑定对话框资源id。

在MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box)。本文对此分别简述其创建方法。

一、模态对话框(model dialog box)

在程序运行的过程中,若出现了模态对话框,那么主窗口将无法发送消息,直到模态对话框退出才可以发送。
点击模态对话框中的OK按钮,模态对话框会被销毁。
创建一个模态对话框的代码如下所示:


  
  1. //创建一个模态对话框

  2. CTestDialog td;

  3. td.DoModal();

其中CTestDialog为我自己所新建的和一个对话框资源相关联的对话框类。
可以创建一个布局模态对话框类变量,不用担心它会随着所在函数返回而被销毁。因为DoModal()函数的一个功能是,当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行。
DoModal()函数也有显示对话框的功能,所以也无需调用其他函数来显示对话框。

二、非模态对话框(modaless dialog box)

在程序运行的过程中,若出现了非模态对话框,主窗口还可以发送消息。
点击非模态对话框中的OK按钮,非模态对话框没有销毁,只是隐藏了。若想点击OK按钮时,非模态对话框也销毁,那么CTestDialog类必须重载其基类CDialog的虚函数OnOK(),在此函数里调用DestroyWindow()来销毁此对话框。

此处采用和上面一样的方式来创建一个非模态对话框,代码如下:


  
  1. CTestDialog td;

  2. td.Create(IDD_DIALOG1); //创建一个非模态对话框

  3. td.ShowWindow(SW_SHOWNORMAL); //显示非模态对话框

那么,在运行时,你会发现此对话框无法显示。这是因为你声明的对话框变量td是局部变量,但这个函数返回时,td也被析构了,所以无法显示此对话框。

创建非模态对话框,必须声明一个指向CTestDialog类的指针变量,且需要显示的调用ShowWindow()才能将对话框显示出来。有两种创建方法:

(1)采用局部变量创建一个非模态对话框


  
  1. //采用局部变量创建一个非模态对话框

  2. CTestDialog *pTD = new CTestDialog();

  3. pTD->Create(IDD_DIALOG1); //创建一个非模态对话框

  4. pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框

因为指针在声明的时候是被放在堆栈中,只有整个应用程序关闭后才会被销毁,所以可以正常显示对话框。
这种方法虽然不影响程序的运行,可是指针pTD所指向的内存却导致不可用,这样的编程很不好。

(2)采用成员变量创建一个非模态对话框
首先在你所要编写的类的头文件中声明一个指针变量:


  
  1. private:

  2. CTestDialog *pTD;

然后再在相应的CPP文件,在你要创建对话框的位置添加如下代码:


  
  1. //采用成员变量创建一个非模态对话框

  2. pTD = new CTestDialog(); //给指针分配内存

  3. pTD->Create(IDD_DIALOG1); //创建一个非模态对话框

  4. pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框

最后在所在类的析构函数中收回pTD所指向的内存:

delete pTD;

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

众所周知的,MFC中非模态对话框在显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换。本文就来给大家讲解一下非模态对话框的实现方法:

一、非模态对话框的对话框资源和对话框类

实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,因此,在创建模态对话框时所创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改。

二、创建及显示非模态对话框的步骤

需要修改的是,对话框类实例的创建和显示,也就是之前在CAdditionDlg::OnBnClickedAddButton()函数体中添加的对话框显示代码。下面是具体步骤:

1. 在AdditionDlg.h中包含CTipDlg头文件并定义CTipDlg类型的指针成员变量。详细操作方法是,在AdditionDlg.cpp中 删除之前添加的#include "TipDlg.h",而在AdditionDlg.h中添加#include "TipDlg.h",这是因为我们需要在AdditionDlg.h中定义CTipDlg类型的指针变量,所以要先包含它的头文件;然后在 AdditionDlg.h中为CAdditionDlg类添加private成员变量CTipDlg  *m_pTipDlg;。

2.在CAdditionDlg类的构造函数中初始化成员变量m_pTipDlg。如果cpp文件中函数太多,我们可以在Class View上半个视图中找到CAdditionDlg类,再在下半个视图中找到其构造函数双击,中间客户区域即可马上切到构造函数的实现处。在构造函数体中 添加m_pTipDlg = NULL;,这是个好习惯,在任何指针变量使用前都初始化,可以避免因误访问重要内存地址而 破坏此地址的数据。

3.添加非模态对话框的创建和显示代 码。VC++中注释单行代码使用“//”,注释多行代码可以在需注释的代码开始处添加“/*”,结束处添加“*/”。修改后的 CAdditionDlg::OnBnClickedAddButton()

函数如下:


  
  1. void CAdditionDlg::OnBnClickedAddButton()

  2. {

  3. // TODO: Add your control notification handler code here

  4. /*INT_PTR nRes; // 用于保存DoModal函数的返回值

  5. CTipDlg tipDlg; // 构造对话框类CTipDlg的实例

  6. nRes = tipDlg.DoModal(); // 弹出对话框

  7. if (IDCANCEL == nRes) // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行

  8. return;*/

  9. // 如果指针变量m_pTipDlg的值为NULL,则对话框还未创建,需要动态创建

  10. if (NULL == m_pTipDlg)

  11. {

  12. // 创建非模态对话框实例

  13. m_pTipDlg = new CTipDlg();

  14. m_pTipDlg->Create(IDD_TIP_DIALOG, this);

  15. }

  16. // 显示非模态对话框

  17. m_pTipDlg->ShowWindow(SW_SHOW);

  18. // 将各控件中的数据保存到相应的变量

  19. UpdateData(TRUE);

  20. // 将被加数和加数的加和赋值给m_editSum

  21. m_editSum = m_editSummand + m_editAddend;

  22. // 根据各变量的值更新相应的控件。和的编辑框会显示m_editSum的值

  23. UpdateData(FALSE);

  24. }

4.因为此非模态对话框实例是动态创建的,所以需要手动删除此动态对象来销毁对话框。我们在 CAdditionDlg类的析构函数中添加删除代码,但是MFC并没有自动给出析构函数,这时需要我们手动添加,在对话框对象析构时就会调用我们自定义 的析构函数了。在AdditionDlg.h文件中为CAdditionDlg添加析构函数声明:~CAdditionDlg();,然后在 AdditionDlg.cpp文件中添加析构函数的实现,函数体如下:


  
  1. CAdditionDlg::~CAdditionDlg()

  2. {

  3. // 如果非模态对话框已经创建则删除它

  4. if (NULL != m_pTipDlg)

  5. {

  6. // 删除非模态对话框对象

  7. delete m_pTipDlg;

  8. }

  9. }

这样,非模态对话框创建和显示的代码就添加修改完了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC-创建模态对话框和非模态对话框的方法 的相关文章

  • Windows句柄-2

    这里需要说明 xff1a 1 这里将句柄所能标识的所有东西 xff08 如窗口 文件 画笔等 xff09 统称为 对象 2 图中一个小横框表示一定大小的内存区域 xff0c 并不代表一个字节 xff0c 如标有0X00000AC6的横框表示
  • Windows消息机制详解-6

    消息系统对于一个win32程序来说十分重要 xff0c 它是一个程序运行的动力源泉 一个消息 xff0c 是系统定义的一个32位的值 xff0c 他唯一的定义了一个事件 xff0c 向 Windows发出一个通知 xff0c 告诉应用程序某
  • TranslateMessage ,GetMessage, DispatchMessage分析

    TranslateMessage amp msg TranslateMessage是用来把快捷键消息转换为字符消息 并将转换后的新消息投递到调用线程的消息队列中 由于Windows对所有键盘编码都是采用虚拟键的定义 xff0c 这样当按键按
  • Windows消息机制-PreTranslateMessage

    PreTranslateMessage作用和使用方法 Windows消息机制的流程 xff1a A 操作系统接收应用程序的窗口消息 xff0c 将消息投递到该应用程序的消息队列中 B 应用程序在消息循环中调用GetMessage函数从消息队
  • 线程中发送消息阻塞问题解决

    发送消息时阻塞的两种方案1 此处应post发送消息放到消息队列中 xff0c 直接send调用响应过程的话如果消息响应未结束则会一直阻塞工作线程2 用send的话在此处开辟工作线程执行逻辑
  • qt+visa实现程控实例

    软件环境 系统 windows 10开发环境 Qt 5 80visa库版本 visa 6 0 软件下载 QtNI MAXIVI 步骤 1 添加依赖库 在Demo pro中添加依赖 win32 INCLUDEPATH 43 61 34 C P
  • Qt中标准对话框实例,QObject::tr()的作用

    函数 tr 全名是QObject tr 被它处理的 字符串可以 使用工具提 取出来翻译 成其他语言 也就是做国际化使用 只要记住 Qt 的最佳实践 如果你想让你的程序国际化的话 那么 所有用户可见的字符串都要使用 QObject tr 但是
  • 公司电脑安装了vncserver,公司电脑安装了vncserver怎么卸载vncserver

    在使用vncserver时感觉很方便 xff0c 但在卸载vncserver时往往比较让人头疼 xff0c 之前公司电脑安装了vncserver使用时我还比较庆幸 xff0c 但当我卸载时真的费了很多力气 xff0c 那今天小编就来教教大家
  • 进程,线程,消息循环的关系

    一个进程有n个线程 xff0c 一个线程有一个消息队列或事件队列和一个活动的消息循环 xff0c 每个模态窗体有一个消息循环函数和一个消息响应过程函数 xff0c 一个线程里哪个模态窗体激活即运行哪个窗体的消息循环 xff0c 一个模态窗体
  • Qt匿名函数的写法

    匿名函数也可以被叫做Lambda表达式 xff0c 自C 43 43 11中引入该特性 本文主要介绍Qt里使用到的匿名函数 c11新特性中加入了lambda表达式 xff0c 所以Qt 也支持 需在 pro文件中加入 CONFIG 43 6
  • QT c++ 中使用PostMessage/SendMessage实例

    PostMessage是Windows API 应用程序接口 中的一个常用函数 xff0c 用于将一条消息放入到消息队列中 并且不会等待响应的线程处理消息 xff0c 而是直接返回 xff08 简单的理解就是异步 xff09 而SendMe
  • Qt-线程启动与关闭实例

    养成资源回收的好习惯 xff0c 任何时候都要想起开辟过的内存回收 就是利用关闭窗口时调用槽函数回收掉 具体步骤不难 xff0c 如下 xff1a 1 xff09 退出线程 xff1b 2 xff09 回收子线程 xff1b 3 xff09
  • qt中QListView的用法和QModelIndex的使用

    使用QTreeView xff0c 对于很多函数中针对item的唯一标识QModelIndex的使用 xff0c 记录下两种对于QModelIdex的使用 1 xff0c 树形结构的item设置为选中 QModelIndex rootInd
  • Qt-QMessageBox用法详解

    QMessageBox 是 Qt 框架中常用的一个类 xff0c 可以生成各式各样 各种用途的消息对话框 xff0c 如图 1 所示 图 1 QMessageBox消息对话框 很多 GUI 程序都会用到消息对话框 xff0c 且很多场景中使
  • Qt-手动布局

    简述 手动布局 xff0c 可以实现和水平布局 垂直布局 网格布局等相同的效果 xff0c 也可实现属于自己的自定义布局 xff0c 当窗体缩放时 xff0c 控件可以随之变化 其对于坐标系的建立有严格要求 xff0c 纯代码思维 xff0
  • Qt-5种布局控件详解

    实际开发中 xff0c 一个界面上可能包含十几个控件 xff0c 手动调整它们的位置既费时又费力 作为一款成熟的 GUI 框架 xff0c Qt 提供了很多摆放控件的辅助工具 xff08 又称布局管理器或者布局控件 xff09 xff0c
  • vnc怎么设置自适应屏幕,2种方法教你vnc怎么设置自适应屏幕

    VNC 是在基于 UNIX和 LINUX 操作系统的免费的开源软件 xff0c 远程控制能力强大 xff0c 高效实用 xff0c 其性能可以和 WIndows和 MAC 中的任何远程控制软件媲美 在使用vnc软件的过程中 xff0c 往往
  • C++中的野指针问题

    文章目录 1 C和C 43 43 中的野指针问题 1 1 野指针的概念 1 2 野指针的由来 1 3 杜绝野指针的基本原则 2 C和C 43 43 中的常见内存错误 2 1 常见内存错误 2 2 内存操作的基本规则 1 C和C 43 43
  • Qt-调用dll动态链接库

    事先写一个简单的dll文件 myDLL dll C版接口的 并且用我前两篇有关DLL文章里面的方法 xff0c 从dll中导出了导入库 lib 文件 xff0c dll中有两个函数 xff0c 原型如下 xff1a void HelloWo
  • Qt调用动态链接库ControlCAN.dll实例

    注意 xff1a controlCan引用静态库时需要将kerneldlls文件夹放置程序的输出路径下设备才能链接成功 首先添加外部库文件 xff08 lib文件 xff09 一 添加第三方的头文件 这个问题再简单不过了 xff0c 不过我

随机推荐

  • asposeword.dll通过word模板生成word、PDF

    效果图 1 word模板 xff08 部分 xff09 书签 2 生成结果图 开始上代码 Dictionary lt string string gt dictSource 61 new Dictionary lt string strin
  • Qt-捕获Windows消息

    Qt4版本的实现 方法1 xff1a 通过继承QWidget的类中重新实现winEvent接口 xff0c 以接收在消息参数中传递的本机Windows事件 bool QWidget winEvent MSG message long res
  • c语言-指针

    目录 1 指针是什么 xff1f 2 指针和指针类型 2 1 指针 43 整数 2 2 指针的解引用 3 野指针 3 1 野指针成因 3 2 如何规避野指针 4 指针运算 4 1 指针 43 整数 4 2 指针 指针 4 3 指针的关系运算
  • 汇编-函数调用的理解

    1 从代码的顺序执行说起 每一个程序员脑子里应该都有这么一种印象 xff1a 程序是顺序执行的 这个观点其实和我们开篇所讲的cpu的流水线执行过程直接相关 让我们再回忆一下脑海中关于函数调用的概念 xff0c 也许会是这个样子 xff1a
  • qt-制作生成dll动态链接库实例

    debug模式下体积过大的话 xff0c 选择release编译会缩小很大一部分体积 选择创建qt库项目 xff0c 根据提示选择相应配置 xff1a Type xff1a Shared Libray xff1b Statically li
  • qt-信号和槽的连接写法

    Qt4 旧语法 xff1a connect sender SIGNAL valueChanged QString QString receiver SLOT updateValue QString Qt新语法 xff1a QLabel la
  • C#实现查找指定端口被哪个进程占用并处理进程及dos命令下操作

    1 检查当前系统中8000端口是否正在被其它进程使用 xff1b 2 如果8000端口正在被使用 xff0c 就找出该进程 xff0c 并强行结束 3 使用C 变成语言实现 检查8000端口在被哪一个进程所使用 简单的解决方案如下 xff1
  • vncserver命令,vncserver命令有哪些

    vncserver是一个用来共享linux服务器上资源给其他分布式用户的服务 vncserver命令能实现的功能很多 xff0c 那具体有哪些vncserver命令呢 xff1f 跟着小编一起去看看吧 如图 xff1a xff08 官网地址
  • QT-QPainter绘制曲线等基本图形

    Qt中绘制2D图形最核心的一个类是QPainter 类QPainter是在设备类QPaintDevice上绘制几何图形 xff08 包括直线 曲线 圆形 弧形 矩形等等 xff09 xff0c 其中设备类QPaintDevice的子类又有Q
  • qt-项目部署(某些情况下编译器中运行异常的话可以使用命令windeployqt 程序名在安装的qt dos命令下补全部分依赖库在运行项目或发布)

    一般qt项目启动不起来大部分都是因为依赖库要么缺失要么位数不对 有时候缺失的dll不会提示出来 xff0c 建议检查设置计算机环境变量 xff0c 项目编译设置路径等 xff0c 然后再使用dos命令windeployqt添加qt依赖库 Q
  • Creator-配置MSVC调试器

    安装完QT后会看到Qt Creator中的MSVC构建组件带有黄色的感叹号 xff0c 那是因为没有调试器的原因 由于Qt MSVC版本套件没有默认安装调试器 需要我们自己手动下载安装 根据官方文档Setting Up Debugger Q
  • MFC和QT等UI框架的特点

    UI设计的3大原则 xff1a 面向对象 xff1b MVC xff1b 消息队列驱动 xff1b 直到现在各个UI系统 xff0c 包括题主所提到的MFC WPF Qt xff0c 也包括其它 xff0c 诸如Android SDK Co
  • MFC中创建线程实例

    static UINT ThreadFunc LPVOID pParam 线程函数声明UINT CTestApp ThreadFunc LPVOID pParam 可以传递对话框的等指针变量 利用pParam指针参数来操作各种ui对象和类型
  • QT和MFC中怎么使用继承基类的自定义控件放置在界面上

    1 Qt中 自定义button继承于QPushButton xff0c f2查看指定控件的声明定义 xff0c 可以手动改ui form h文件里各个类型的控件指针变量 xff0c 改成自己定义的 34 xff08 这里ui form h在
  • MFC-Tab Control控件使用

    在MFC当中使用Tab Control控件切换不同的界面 xff0c 使用起来会复杂一些 xff0c 至少是比Qt中的Tab Widget复杂得多 我接下来会以一个MFC对话框应用程序为例子 xff0c 说明Tab Control控件的简单
  • MFC中访问界面控件的两种方法

    1 在资源中创建一个对话框资源 xff0c 放置一些控件 xff0c 然后使用类向导创建一个此对话框类型的变量 xff0c 项目中会自动创建此对话框的 h和 cpp文件 有两种方式可在代码中访问控件 1 如果在代码中直接访问 则使用this
  • MFC-使用自定义控件的方法

    1 在资源编辑中设计好界面 2 右键界面在类向导里创建类型后自动生成界面的 h和 cpp文件 3 在使用该界面类型的类中创建该成员变量 4 Create创建注册窗体UI CRect crect GetClientRect amp crect
  • MFC中添加的ID资源号提示找不到声名问题

    1 查看resource h资源文件 xff0c 基本上都是因为某些界面上的修改等原因造成了里面部分定义ID号值重复了才报的错 xff0c 所以要在resource h文件中手动修改成不一样的id值
  • vnc远程桌面,vnc远程桌面使用教程图解

    作为一个新手小白 xff0c 你是否也像小编一样不知道如何实现vnc远程桌面呢 xff1f vnc作为一款出色的远程软件 xff0c 在远程桌面方面也同样出色 xff0c 那如何实现vnc远程桌面使用 xff1f 小编发现了一款超好用的vn
  • MFC-创建模态对话框和非模态对话框的方法

    注意 xff1a 以下实例中创建模态对话框时没有用create xff08 id号 xff09 绑定资源id xff0c 而非模态对话框中要用create xff08 id号 xff09 绑定对话框资源id 在MFC中对话框有两种形式 xf