实用指南:【10】MFC入门到精通——MFC 创建向导对话框、属性页类、属性表类、代码

news/2025/11/23 22:28:41/文章来源:https://www.cnblogs.com/gccbuaa/p/19261727

文章目录

  • 十、创建向导对话框
    • 10.1 创建属性页对话框资源
    • 10.2 创建属性页类
    • 10.3 创建属性表类
    • 10.4 显示向导对话框
    • 10.5 注意事项 运行可能报错
    • 10.6 完整代码下载

十、创建向导对话框

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

仍然以前面的“加法计算器”的例子为基础,在其中加入向导对话框,我们可以用它来说明加法计算器的使用方法,一步一步引导用户操作,这也是比较常见的用法。

加法计算器使用时大概可以分为三步:输入被加数、输入加数、点“计算”按钮。

就详细说明向导对话框的创建步骤:

10.1 创建属性页对话框资源

根据创建对话框模板和修改对话框属性中所讲方法,在“Resource View”的Dialog”节点上点右键,然后在右键菜单中选择“Insert Dialog”创建第一个对话框模板,对话框的ID属性设置为IDD_SUMMAND_PAGE,Caption属性改为“被加数页”,Style属性在下拉列表中选择“Child”,Border属性在下拉列表中选择“Thin”。

删除“OK”和“Cancel”按钮,再按照为对话框添加控件中所讲方法,添加一个静态文本框,并修改静态文本框的Caption属性为“请先输入double型被加数”。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

按照上述步骤,继续添加第二个和第三个对话框资源。第二个对话框模板的ID设为IDD_ADDEND_PAGE,Caption属性改为“加数页”,也添加一个静态文本框,Caption设为“请继续输入double型加数”,其他属性同第一个对话框。第三个对话框模板的ID设为IDD_ADD_PAGE,Caption属性改为“计算页”,添加静态文本框的Caption属性改为“最后请按下“计算”按钮”,其他属性也第一个对话框一样。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

10.2 创建属性页类

按照创建对话框类和添加控件变量中的方法,在第一个对话框模板上点右键,在右键菜单中选择“Add Class”,弹出类向导对话框,在“Class name”编辑框中输入类名“CSummandPage”,与之前不同的是,因为属性页类都应继承于CPropertyPage类,所以要修改下面“Base class”的选项,在下拉列表中选择“CPropertyPage”。

基类下来列表中没有CPropertyPage,只有CMFCPropertyPage 。那就选择CMFCPropertyPage

CMFCPropertySheet和CMFCPropertyPage都是vs08sp1以后引入的新类,扩充了已有的CPropertySheet和CPropertyPage这两个类。

在这里插入图片描述

因为是第一个属性页,所以它应该有一个“下一步”按钮,在哪里添加呢? 上一讲CPropertyPage类的可重载函数中提到,OnSetActive函数用于处理属性页被切换为当前活动页的消息,所以我们可以在OnSetActive函数中进行相关设置。

那怎样重载OnSetActive函数呢? 我们可以在“Class View”中找到“CSummandPage”节点,点右键弹出右键菜单,选择“Properties”,然后VS右侧面板上会显示对话框的属性列表,属性列表的工具栏上有个tip信息为 “Overrides” (重载) 的按钮,按下它,下方列表中就列出了重载函数,找到“OnSetActive”,点其右侧空白列表项出现向下箭头,再点箭头就在下面出现了“OnSetActive”的选项,选择它就会自动在CSummandPage类中添加函数OnSetActive。

在这里插入图片描述

在这里插入图片描述

我们只需在OnSetActive函数体中添加相关代码就可以实现添加“下一步”按钮的效果了。新的函数体如下:

BOOL CSummandPage::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
// 获得父窗口,即属性表CPropertySheet类
CMFCPropertySheet* psheet = (CMFCPropertySheet*)GetParent();
// 设置属性表只有“下一步”按钮
psheet->SetWizardButtons(PSWIZB_NEXT);
return CMFCPropertyPage::OnSetActive();
}

为第二个和第三个对话框也分别添加属性页类CAddendPage和CAddPage。

基类下来列表中没有CPropertyPage,只有CMFCPropertyPage 。那就选择CMFCPropertyPage

CMFCPropertySheet和CMFCPropertyPage都是vs08sp1以后引入的新类,扩充了已有的CPropertySheet和CPropertyPage这两个类。

在这里插入图片描述
在这里插入图片描述

第二个对话框的属性页不需要重载OnSetActive函数。

第三个对话框是最后一个对话框,所以不需要“下一步”按钮,而应该换成“完成”按钮,所以也需要重载OnSetActive函数设置“完成”按钮。重载后的OnSetActive如下:
在这里插入图片描述

BOOL CAddPage::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
// 获得父窗口,即属性表CPropertySheet类
CMFCPropertySheet* psheet = (CMFCPropertySheet*)GetParent();
//设置属性表只有“完成”按钮
psheet->SetFinishText(_T("完成"));
return CMFCPropertyPage::OnSetActive();
}

上面的代码段中,字符串“完成”前加了个_T,这是因为本工程创建的时候用的默认的Unicode字符集,而如果“完成”前不加_T就是ASCII字符串。_T实际上是一个宏,工程的字符集选择为Unicode时字符串就转为Unicode字符串,选择为Muli-Byte时就转为ASCII字符串。我们可以在Solution Explorer的Addition根节点上点右键,在右键菜单上选择“Properties”,弹出工程的属性对话框,Configuration Properties->General右侧列表中的Character Set就显示选择的字符集。

那点了第三个属性页上的“完成”按钮我们想进行某些处理的话,就重载OnWizardFinish函数,方法同OnSetActive函数。重载后的OnWizardFinish函数如下:

在这里插入图片描述

BOOL CAddPage::OnWizardFinish()
{
// TODO: 在此添加专用代码和/或调用基类
// 提示向导完成
MessageBox(_T("使用说明向导已阅读完!"));
return CMFCPropertyPage::OnWizardFinish();
}

10.3 创建属性表类

属性页资源和属性页类创建完以后,还不能生成向导对话框,我们还需要一个属性表类,来容纳这些属性页。

在Solution Explorer视图中的根节点“Addition”上点右键,在右键菜单中选择 类向导->添加类,选择“MFC Class”,弹出对话框,设置Class name为CAddSheet,Base class选择“CMFCPropertySheet”,点“Finish”按钮,这样就属性表类就建好了。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

接下来,在新生成的AddSheet.h中包含三个属性页类的头文件:

#include "CSummandPage.h"
#include "CAddendPage.h"
#include "CAddPage.h"

之后在AddSheet.h中添加private变量:

给三个页类 实例化对象;

private:
CSummandPage m_summandPage;
CAddendPage m_addendPage;
CAddPage m_addPage;

然后在AddSheet.cpp文件中修改CAddSheet的两个构造函数为:

CAddSheet::CAddSheet()
{
// 添加三个属性页到属性表
AddPage(&m_summandPage);//这里的AddPage()是系统头文件afxpropertysheet.h,不是我们创建的CAddPage
AddPage(&m_addendPage);
AddPage(&m_addPage);
}
CAddSheet::~CAddSheet()
{
// 添加三个属性页到属性表
AddPage(&m_summandPage);
AddPage(&m_addendPage);
AddPage(&m_addPage);
}

10.4 显示向导对话框

我们在加法计算器对话框上添加一个按钮,点击它就打开向导对话框。此按钮的ID设为IDC_INSTRUCT_BUTTON,Caption属性设为“使用说明”。

按照为控件添加消息处理函数中所讲方法,为IDC_INSTRUCT_BUTTON按钮在CAdditionDlg类中添加点击消息的处理函数OnBnClickedInstructButton。然后在AdditionDlg.cpp文件中包含CAddSheet的头文件:#include “AddSheet.h”。最后修改OnBnClickedInstructButton函数如下:

void CAdditionDlg::OnBnClickedInstructButton()
{
// TODO: 在此添加控件通知处理程序代码
// 创建属性表对象
CAddSheet sheet;//CAddSheet sheet(_T(""));
// 设置属性对话框为向导对话框
sheet.SetWizardMode();
// 打开模态向导对话框
sheet.DoModal();
}

到此,向导对话框就完整的创建完成了,并可以在加法计算器对话框上点 “使用说明” 按钮显示出来。我们来看看效果吧:

在这里插入图片描述

上图只是被加数页的效果,点其上“下一步”按钮就可以继续显示后面的两个页面。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
是不是向导对话框没有以前想象的那般复杂了?大家可以发挥想象,进行更复杂的修改,实现更完善的功能。依然欢迎朋友们到知乎来交流学习。

10.5 注意事项 运行可能报错

运行可能报错
在这里插入图片描述
点击报错提示,跳转到CSummandPage.cpp的构造函数;

在这里插入图片描述

于是将 CMFCPropertyPage(IDD_SUMMADD_PAGE, pParent) 括号里 的pParen参数删了,就好了

同理,我们将属性页类CSummandPage、CAddendPage和CAddPage的构造函数做同样修改;

修改后如下
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

10.6 完整代码下载

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

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

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

相关文章

2025-09-10-Wed-T-Kubernetes

1. 介绍说明 1.1 基础设施的变革单机场景单机(操作系统+app)--> 虚拟化(VM+OS+APP) --> 容器化(Container + APP)集群场景 IAAS集群场景 PAASKubernetes优势服务发现和负载均衡 存储编排(添加任何本地或云服…

一文入门 Dify平台的插件开发

一文入门 Dify平台的插件开发 欢迎开始 Dify 插件开发 - https://docs.dify.ai/plugin-dev-zh/0111-getting-started-dify-plugin Dify Plugin 开发速查表 - https://docs.dify.ai/plugin-dev-zh/0131-cheatsheet#环境…

20232326 2025-2026-1 《网络与系统攻防技术》实验六实验报告

1. 实验内容 本实践目标是掌握metasploit的用法。 指导书参考Rapid7官网的指导教程。 https://docs.rapid7.com/metasploit/metasploitable-2-exploitability-guide/ 下载官方靶机Metasploitable2,完成下面实验内容。…

2025年11月小程序开发公司TOP5评测:功能落地与适配筛选标准,西南地区企业选择指南

随着数字化转型加速,小程序已成为企业连接用户、提升运营效率的核心载体。本榜单基于技术实现能力、行业适配深度、服务交付效能三大维度,结合企业服务平台公开数据及客户案例反馈,权威解析2025年西南地区五大小程序…

2025年11月云南数字人供应商最新TOP5推荐:精细建模优质选择

在数字经济加速渗透的当下,数字人技术正从概念走向规模化应用,成为企业降本增效、创新服务模式的核心工具。据艾瑞咨询《2025年中国数字人行业研究报告》显示,2024年中国数字人市场规模突破600亿元,企业级服务需求…

第二讲下梯度下降算法

梯度下降算法 梯度下降有时会使loss不降反而上升原因是: 核心结论是:loss 上升主要源于学习率过高、数据 / 特征问题或模型设置不当,导致优化偏离最优方向。 关键原因学习率过大:步长超过最优解范围,每次更新都跳…

Java云计算技术怎样应对故障

Java云计算技术通过一系列的策略和工具来应对故障,确保系统的稳定性和可用性。以下是一些关键的策略和工具: 故障排查策略CPU问题排查:使用jstack工具分析堆栈情况,定位CPU异常的原因,如死循环或频繁的垃圾回收(…

2025-08-02-Sat-T-RabbitMQ

基础篇1. 初识MQ 1.1 同步调用 同步调用是一种线性执行模式。当你调用一个函数后,程序会暂停在当前位置,直到这个函数执行完毕并返回结果后,才会继续执行下一行代码。这就像你在餐厅点餐后,站在柜台前一直等到厨师…

Nand2Tetris 笔记

布尔函数ALU内存机器语言计算机体系结构

审美积累暗色UI设计超越美学的用户体验

审美积累暗色UI设计超越美学的用户体验研究了上百个暗色设计,才发现顶尖的“黑”从不单调。它可以是深邃的科技感,也可以是温暖的陪伴感。分享5个超赞的暗黑系UI设计范本,一起来积累高级审美! 1. 克制用色,信息层…

具有超高峰值抑制比和低功耗的全光可调谐微波滤波器

该研究提出了一种基于4个级联的光机械微环谐振器(MRR)实现高抑制比、大中心频率和带宽调谐范围的微波光子滤波器(MPF)。当每两个MRR的谐振波长调谐到对齐时,硅器件的透射谱为具有高消光比的陷波双峰分布。光载波被固定…

11.23

1. page:最核心指令,定义页面编码、语言、导入包等示例:解决中文乱码+指定Java语言+导入工具类 jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="…

实用指南:F-INR: Functional Tensor Decomposition for Implicit Neural Representations

实用指南:F-INR: Functional Tensor Decomposition for Implicit Neural Representationspre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…

实验3 类和对象_基础编程 - yuyue

TASK1 button.hpp #pragma once#include <iostream> #include <string>class Button { public:Button(const std::string &label_);const std::string& get_label() const;void click();private:s…

11/23/2025 一周总结

11/18/2025 模拟赛 T1 做太久了,方向是对的,但是一直没想清楚。做题的时候一定要想清楚,不然可能浪费很多时间。 T2 方向是对的,但是没想到怎么优化。优化需要观察性质,说明这种观察性质的能力还不够,以后还要继…

Java云计算技术如何确保稳定

Java云计算技术确保稳定的关键在于通过一系列安全措施、容错机制、高可用性设计以及性能优化来实现。以下是具体的介绍: 安全措施安全通信协议:使用HTTPS和TLS/SSL等安全协议保护数据传输。 身份验证和授权:利用JWT…

java中sql注入的防范措施是什么

在Java中,防范SQL注入的措施主要包括以下几点:使用预编译语句(PreparedStatement):预编译语句能够将SQL查询与数据分开,从而有效防止SQL注入攻击。在预编译语句中,参数值会被自动转义,避免了恶意代码的注入。 …

【第五章:计算机视觉-项目实战之推荐/广告体系】2.粗排算法-(4)粗排算法模型多目标算法(Multi Task Learning)及目标融合

【第五章:计算机视觉-项目实战之推荐/广告体系】2.粗排算法-(4)粗排算法模型多目标算法(Multi Task Learning)及目标融合2025-11-23 22:00 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important;…

二分查找刷题总结

推荐使用闭区间的方式去做二分查找的题目 如果数量比较少,那么建议使用顺序遍历的方式 因此二分结束时一定有: i指向首个大于 target 的元素,j指向首个小于 target 的元素。易得当数组不包含 target 时,插入索引为…

Solution Set #1

\(1\) 个 set 有 \(10\) 道题。 A. CF1874D Jellyfish and Miku 设 \(f_i\) 为 \(i\to n\) 的期望步数。那么有 \(f_0=f_1+1\),\(f_n=0\),和 \(f_i=f_{i+1}\times \frac{a_{i+1}}{a_i+a_{i+1}}+f_{i-1}\times \frac{…