文章目录

  • 八、模态对话框 和 非模态对话框 创建及显示
    • 8.1 对话框是怎样弹出的
    • 8.2 模态对话框的创建及显示
    • 8.3 非模态对话框的创建及显示
    • 8.4 完整代码下载

八、模态对话框 和 非模态对话框 创建及显示

Windows对话框分为两类:模态对话框非模态对话框。

模态对话框: 当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。

非模态对话框: 非模态对话框是它弹出后,本程序其他窗口仍能响应用户输入。非模态对话框一般用来显示提示信息等。

大家对Windows系统很了解,相信这两种对话框应该都遇到过。之前的加法计算器对话框其实就是模态对话框。

8.1 对话框是怎样弹出的

毕竟加法计算器程序大部分都是MFC自动生成的,对话框怎么弹出来的大家可能还不是很清楚。下面简单说说它是在哪里弹出来的,再重新建一个新的对话框并弹出它,这样大家实践以后就能更灵活的使用模态对话框了。

大家打开 Addition.cpp 文件,可以看到 CAdditionApp 类有个 InitInstance() 函数,在 MFC应用程序框架分析 中提到过此函数,不过那是单文档应用程序 App类 中的,函数体不太相同,但都是进行App类实例的初始化工作。

InitInstance() 函数的 后半部分有一段代码就是定义对话框对象并弹出对话框的,下面给出这段代码并加以注释:

CAdditionDlg dlg; // 定义对话框类CAdditionDlg的对象dlgm_pMainWnd = &dlg; // 将dlg设为主窗口INT_PTR nResponse = dlg.DoModal(); // 弹出对话框dlg,并将DoModal函数的返回值(退出时点击按钮的ID)赋值给nResponseif (nResponse == IDOK) // 判断返回值是否为OK按钮(其ID为IDOK,已经将它删除){// TODO: 在此放置处理何时用//  “确定”来关闭对话框的代码}else if (nResponse == IDCANCEL)// 判断返回值是否为Cancel按钮(其ID为IDCANCEL,将它的Caption改为了“退出”){// TODO: 在此放置处理何时用//  “取消”来关闭对话框的代码}else if (nResponse == -1) //如果函数不能创建对话框,则返回-1{TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");}

弹出对话框比较关键的一个函数,就是对话框类的 DoModal() 函数。CDialog::DoModal() 函数的原型为:

virtual INT_PTR DoModal();

返回值:整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nResult参数值。如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。

调用了它,对话框就会弹出,返回值是退出对话框时所点的按钮的 ID,比如,我们点了“退出”按钮,那么 DoModal 返回值为IDCANCEL。

8.2 模态对话框的创建及显示

MFC 加法计算器 + 模态对话框 完整工程代码下载

为加法计算器程序添加一个对话框,在计算之前询问用户是否要进行计算。大家可以完整的看下对话框的添加和弹出过程。

1.在 Resource View 中的 “Dialog” 上点右键选择 “Insert Dialog”,创建一个新的对话框模板,修改其ID为IDD_TIP_DIALOG,Caption改为“提示”,然后参考 “为对话框添加控件” 中所讲,在对话框模板上添加一个静态文本框(static text),Caption改为“您确定要进行加法计算吗?”,接下来修改OK按钮的Caption为“确定”,Cancel按钮的Caption为“取消”,最后调整各个控件的位置和对话框的大小。最终的对话框模板如下图:

在这里插入图片描述

2.根据“创建对话框类和添加控件变量”中创建对话框类的方法,在对话框模板上点右键选择“Add Class…”,弹出添加类的对话框,设置“Class name”为CTipDlg,点“OK”。在Solution Explorer中可以看到生成了CTipDlg类的头文件TipDlg.h和源文件TipDlg.cpp。

3.我们要在点“计算”按钮之后弹出此提示对话框,那么就要在“计算”按钮的消息处理函数OnBnClickedAddButton()中访问提示对话框类,所以为了访问CTipDlg类,在AdditionDlg.cpp中包含CTipDlg的头文件:#include “CTipDlg.h”。

4.修改OnBnClickedAddButton()的函数体,在所有代码前,构造CTipDlg类的对象tipDlg,并通过语句tipDlg.DoModal();弹出对话框,最后判断DoModal()函数的返回值是IDOK还是IDCANCEL来确定是否继续进行计算。OnBnClickedAddButton()函数修改后如下:

void CAdditionDlg::OnClickedAddButton()
{// TODO: 在此添加控件通知处理程序代码//弹出消息对话框INT_PTR nRes; // 用于保存DoModal函数的返回值CTipDlg tipDlg; // 构造对话框类CTipDlg的实例nRes = tipDlg.DoModal(); // 弹出对话框if (IDCANCEL == nRes) // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行return;// 将各控件中的数据保存到相应的变量//UpdateData(TRUE)将被加数的值和加数的值分别保存到变量m_editSummand和m_editAddend//TRUE 从 控件 传给 变量,FALSE 从 变量 传给 控件。UpdateData(TRUE);// 将被加数和加数的加和赋值给m_editSumm_editSum = m_editSummand + m_editAddend;// 根据各变量的值更新相应的控件。和的编辑框会显示m_editSum的值//最后调用UpdateData(FALSE) 根据被加数、加数、和的值更新三个编辑框的显示值UpdateData(FALSE);
}

5.测试。编译运行程序后,在对话框上输入被加数和加数,点“计算”,弹出提示对话框询问是否进行计算,如果选择“确定”,则提示对话框退出,并在主对话框上显示被加数和加数的和,而如果选择“取消”,则提示对话框也会退出,但主对话框显示的和不变,即没有进行加法计算。
在这里插入图片描述
在这里插入图片描述

8.3 非模态对话框的创建及显示

MFC 加法计算器 + 非模态对话框 完整工程演示代码下载

总结:主要步骤是,创建新对话框后,关联一个类,然后用一个指针指向该类;接着用该指针创建对话框和显示对话框,最后在虚构函数中销毁该指针,释放资源。

**非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换。**将上一讲中创建的Tip模态对话框改为非模态对话框,让大家看下效果。

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

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

  1. 在 AdditionDlg.h 中包含 CTipDlg 头文件并定义 CTipDlg类型的指针成员变量。

详细操作方法是,在 AdditionDlg.cpp中删除之前添加的 #include “CTipDlg.h”,而在 AdditionDlg.h 中添加 #include “CTipDlg.h”,这是因为我们需要在AdditionDlg.h 中定义 CTipDlg 类型的 指针变量,所以要先包含它的头文件;

然后在 AdditionDlg.h 中为 CAdditionDlg类添加 private 成员变量 CTipDlg *m_pTipDlg; 。
在这里插入图片描述

  1. 在CAdditionDlg类的构造函数中初始化成员变量m_pTipDlg。在构造函数体中添加m_pTipDlg = NULL;

这是个好习惯,在C++编程入门系列的指针的赋值和指针运算中说到过,在任何指针变量使用前都初始化,可以避免因误访问重要内存地址而破坏此地址的数据。

在这里插入图片描述

  1. 将上一讲中添加的模态对话框显示代码注释或删除掉,添加非模态对话框的创建和显示代码。VC++中注释单行代码使用“//”,注释多行代码可以在需注释的代码开始处添加“/”,结束处添加“/”。修改后的CAdditionDlg::OnBnClickedAddButton()函数如下:
void CAdditionDlg::OnClickedAddButton()
{// TODO: 在此添加控件通知处理程序代码// 如果指针变量m_pTipDlg的值为NULL,则对话框还未创建,需要动态创建if (NULL == m_pTipDlg){// 创建非模态对话框实例m_pTipDlg = new CTipDlg();m_pTipDlg->Create(IDD_TIP_DIALOG, this);}// 显示非模态对话框m_pTipDlg->ShowWindow(SW_SHOW);// 将各控件中的数据保存到相应的变量UpdateData(TRUE);// 将被加数和加数的加和赋值给m_editSumm_editSum = m_editSummand + m_editAddend;// 根据各变量的值更新相应的控件。和的编辑框会显示m_editSum的值UpdateData(FALSE);
}

这样,非模态对话框创建和显示的代码就添加修改完了。让我们运行下看看效果吧。

在这里插入图片描述

在加法计算器对话框上输入被加数和加数,然后点“计算”按钮,依然像上节一样弹出了提示对话框,但是先不要关闭它,你可以拖动它后面的加法计算器对话框试试,我们发现加法计算器对话框竟然可以拖动了,而且“和”编辑框里已经显示了运算结果,这表明提示对话框显示以后还没有关闭,OnBnClickedAddButton() 就继续向下执行了,不仅如此,加法计算器的每个编辑框还都可以响应输入。

这只是一个简单的例子,非模态对话框的用处有很多,以后大家在软件开发中会用到。

8.4 完整代码下载

MFC 加法计算器 + 模态对话框 完整工程代码下载
MFC 加法计算器 + 非模态对话框 完整工程演示代码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89226.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89226.shtml
英文地址,请注明出处:http://en.pswp.cn/web/89226.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

github上传大文件(多种解决方案)

之前一直用vscode的上传项目方法,这个方便之处在于不用打开git终端输入各种命令,不过麻烦的是我一直无法拉取github上的远程仓库提交,每次只能更新已有的仓库并且上传的文件还不能太大,应该是不能超过100MB,而且直接在…

生活污水深度除磷的方法

生活污水中磷含量过多的危害大家都知道总磷是水质检测的重要指标之一,在污水处理中生活污水往往都会出现总磷超标的现象。生活污水磷超标的危害是多方面的主要包括水体富营养化、危害水生生物、影响人类健康,以及可能引发蓝藻水华等问题。除磷方法污水的…

Flutter瀑布流布局深度实践:打造高性能动态图片墙

本文将深入探讨如何在Flutter中实现高性能瀑布流布局,解决动态高度内容展示的核心难题,并带来卓越的用户体验。引言:瀑布流布局的魅力 瀑布流布局(Pinterest-style layout)已成为现代应用展示图片和内容的黄金标准。它通过错落有致的排列方式…

OpenCV 伽马校正函数gammaCorrection()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数用于对输入图像应用伽马校正(Gamma Correction),这是一种非线性的图像处理技术,主要用于调整…

Linux-局域网构建+VLAN 划分 + 端口 MAC-IP 绑定 + 静态 DHCP

文章目录1. 适用于家庭、工作室或小型企业的局域网构建2. VLAN划分3. VLAN 划分 端口 MAC-IP 绑定 静态 DHCP跳转→网络管理基础复习 1. 适用于家庭、工作室或小型企业的局域网构建 ✅ 一、硬件连线(一次到位) 光纤入户 → 光猫/宽带调制解调器光猫…

渗透测试路线

渗透测试学习路线报告(从入门到高级) 引言:渗透测试概述与学习路线设计 渗透测试作为网络安全体系中的核心实践环节,通过模拟真实攻击者的技术手段与攻击路径,主动识别信息系统中的安全漏洞、评估防护机制有效性&#…

Node.js 中http 和 http/2 是两个不同模块对比

1. 核心模块对比 特性http 模块 (HTTP/1.1)http2 模块 (HTTP/2)协议版本HTTP/1.1(文本协议)HTTP/2(二进制协议)多路复用不支持(需多个 TCP 连接)支持(单连接多流)头部压缩无HPACK 压…

3DGS之COLMAP

COLMAP 在 3DGS 中起到了数据预处理和三维重建的关键作用,其处理流程包括特征提取与匹配、稀疏重建、稠密重建和输出文件生成。结合 3DGS 的高斯分布建模和优化算法,COLMAP 提供了场景的几何和相机信息,为实时渲染和三维重建奠定了基础。一、…

RabbitMQ中队列长度限制(Queue Length Limit)详解

在 RabbitMQ 中,队列长度限制(Queue Length Limit)是指对队列中消息数量的最大限制。当队列中的消息数量达到设定的上限时,RabbitMQ 会根据配置的策略(如丢弃旧消息、拒绝新消息或将消息转移到另一个队列)来…

Python设计模式深度解析:建造者模式(Builder Pattern)完全指南

Python设计模式深度解析:建造者模式(Builder Pattern)完全指南前言什么是建造者模式?建造者模式的核心思想模式的核心组成实际案例一:UI选择组件的动态构建抽象建造者基类具体建造者实现列表框建造者复选框建造者工厂建…

elementuiPlus+vue3手脚架后台管理系统,上生产环境之后,如何隐藏vite.config.ts的target地址

在项目根目录创建 .env.production 文件: VITE_API_TARGEThttps://your-real-api.com修改 vite.config.ts: import { defineConfig, loadEnv } from viteexport default defineConfig(({ mode }) > {const env loadEnv(mode, process.cwd(), )return…

ARCGIS PRO DSK 颜色选择控件(ColorPickerControl)的调用

颜色选择控件ColorPickerControl 。一、XAML 集成方式 1 、在WPF窗体上使用,xml:加入空间命名引用xmlns:ui1"clr-namespace:ArcGIS.Desktop.Internal.Mapping.Symbology;assemblyArcGIS.Desktop.Mapping" xmlns:uil"http://schemas.xceed…

深浅拷贝以及函数缓存

目录 数据类型介绍 基本数据类型(Primitive Types) 引用数据类型(Reference Types) 浅拷贝 深拷贝 利用JSON的序列化和反序列化实现深拷贝 递归实现深拷贝 第三方库lodash的cloneDeep 函数缓存的概念 实现方法 数据类型介…

第六届信号处理与计算机科学国际学术会议(SPCS 2025)

重要信息 官网:www.icspcs.org (详情见官网) 时间:2025年8月15-17日 地点:西安 主题 信号处理与智能计算计算科学与人工智能网络与多媒体技术数字信号处理 雷达信号处理 通信信号处理 临时和传感器网络 模拟和…

MongoDB:一个灵活的、可扩展的 NoSQL 数据库

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…

系统思考场景应用

最近一直在与不同行业头部企业共同探讨系统思考这个主题。一些新的合作伙伴也常常问我,系统思考究竟能为客户解决什么痛点? 这两天上课客户的核心需求是:全局思维。在过去的几年里,我深切体会到,随着外部环境的快速变化…

SQL预编译:安全高效数据库操作的关键

通过占位符(如 ? 或命名参数)编写预编译的 SQL 语句(通常通过 PreparedStatement 实现)是数据库操作的最佳实践,主要好处包括:🔒 1. 防止 SQL 注入攻击(核心安全优势) 问…

springboot实验室管理系统-计算机毕业设计源码20916

摘 要 随着高校实验室管理需求的不断增加,传统的管理方式已经难以满足现代教育的要求。为了解决这一问题,本文设计并实现了一种基于VUE和SpringBoot的实验室管理系统。该系统采用前后端分离的架构,前端使用VUE框架,后端基于Sprin…

spdringboot共享学习室小程序 计算机毕业设计源码27728

摘 要 共享学习室小程序是一款基于SpringBoot框架开发的移动端应用,旨在提供一个便捷的自习室预约、管理和资源共享平台。通过该小程序,用户可以方便地预约自习室、查看资讯、提交反馈意见,同时进行失物招领、查看订单信息等多项操作。对于管…

JVM——JVM 的内存区域是如何划分的?

Java 虚拟机运行时数据区分为方法区、堆、虚拟机栈、本地方法栈、程序计数器。 方法区(Method Area): [1] 存储类信息、常量、静态变量和即时编译器(JIT)编译后的代码。 [2] 属于线程共享区域,所有线程共享方法区内存 [3] 在 JDK8之前,HotSpot使用永久代…