每次在使用MFC创建一个框架时,需要一步步选择自己的程序的外观,基本功能等选项,最后MFC会生成一个基本的程序框架,这个就是向导对话框;而属性表单则是另外一种对话框,表单上有多个属性页,每点击某一页,会显示该页的内容,最好的例子是Visual C++6.0中的Option对话框;如图:

属性表单的创建:
属性表单上由许多属性页组成,每个属性页都可以在可视化的编辑环境中编辑,需要添加的资源名称是对话框下面的IDD_PROPPAGE_LARGE、IDD_PROPPAGE_MEDIUM, IDD_PROPPAGE_SMALL,如下图:

创建资源时也可以直接创建对话框,在属性中将Style属性选为Child、Border选为Thin、勾上Disable选项;
创建了资源,下面就是关联MFC的类,属性页的类是CPropertyPage,该类是继承于CDialog类,在使用时需要从CPropertyPage中派生。创建了多个属性页就需要派生多个新类;
创建了属性页,下面就需要创建属性表单,属性表单不需要编辑资源,可以从类CproppertyPage中派生一个新类,用来表示新表单类;
为了将属性页加到属性表单上需要在对应的构造函数中调用AddPage函数,最后需要调用该类的DoModal或者Create函数创建一个模态或者非模态的属性表单;
在一下代码中有三个对应的属性页的类(CProp1、CProp2、CProp3)和一个属性表单的类(CPropSheet);

//在CPropSheet中创建三个属性页的对象
public:CProp1 m_Prop1;Cprop2 m_Prop2;CProp3 m_Prop3;
//在构造函数中添加属性页AddPage(&m_Prop1);AddPage(&m_Prop2);AddPage(&m_Prop3);

至于它的使用则是于普通的对话框类似
向导的创建与使用:
向导所使用的类与属性表单相同,这里就不在说明,为了创建向导,需要在调用DoModal或者Create之前调用SetWizardMode()函数,这样之前的属性表单就变为了向导程序,向导程序上通过下一步来转到下一个属性页,每个页面上都有“下一步”、“上一步”、“取消”按钮,这个特性不便于用户的操作,我们一般习惯于将第一个向导页的“上一步”隐藏,最后一页的“下一步”变为“完成”,为了实现这个需要使用函数SetWizardButtons(),这个函数只有一个参数表示的是页面上按钮的特性,它的取值可以是PSWIZB_BACK、PSWIZB_NEXT、PSWIZB_FINISH、PSWIZB_DISABLEDFINISH中的一个或者几个,分别用来设置该页上的一个“上一步”按钮、“下一步”按钮、“完成”按钮、和一个禁用的“完成”按钮,一般来说在属性页中的OnSetActive函数中调用,当属性页被选中,从而被激活时程序会响应WM_ACTIVATE,而该消息在函数OnSetActive中处理,由于在基类中有了这个函数,所以我们需要重写这个函数,下面是一个例子:

BOOL CProp1::OnSetActive()
{((CPropertySheet*)GetParent())>SetWizardButtons(PSWIZB_NEXT);return CPropertyPage::OnSetActive();
}

有时候需要实现这样的功能:属性页上有一些信息需要用户填写或选择,当用户没有选择或填写完整时不允许进入下一个页面。
每次需要进入下个页面时用户会单击“下一步”按钮,而这个时候程序会调用OnWizardNext函数进入下一个页面(根据页面按钮的不同,点击不同的按钮程序会调用OnWizardNext、OnWizardBack、OnWizardFinish),当该函数返回-1时会禁止属性页发生变更,返回0时会正常进入下一页,下面是一个例子代码:

LRESULT CProp1::OnWizardNext()
{// TODO: 在此添加专用代码和/或调用基类UpdateData(TRUE);if (-1 == m_occupation){MessageBox(TEXT("请选择你的职业"));return -1;}if (TEXT("") == m_workAddr){MessageBox(TEXT("请选择你的工作地点"));return -1;}return CPropertyPage::OnWizardNext();
}

注意:将变量与控件相关联时为了获取控件返回的值需要调用UpdateData()函数,当该函数参数为TRUE时会调用DoDataExchange,该函数会根据控件返回的值,动态更新变量的值;
一般情况下只有当用户点击完成时才保存用户输入的信息当用户点击取消时应该取消信息的保存;一般情况下CPropertySheet类的DoModal函数返回值是IDOK或者IDCANCLE。但是当属性表单被创建为向导时会返回ID_WIZFINISH和IDCANCLE这个时候我们可以根据返回值来判断是否保存;

转载于:https://www.cnblogs.com/lanuage/p/7725759.html

MFC中属性表单和向导对话框的使用相关推荐

  1. MFC——CPropertySheet(属性表单)和CPropertyPage(属性页)——实现分页显示

    今天在学习的时候,实现了一种分页显示的功能.如下图: 以下是实现步骤: 1.在资源文件中添加三个IDD_PROPPAGE_LARGE,也就是三个dialog.我给他们取名为IDD_PROP1.IDD_ ...

  2. MFC创建属性表单“所需资源不存在”错误解决方法

    看一下这篇文章的第六步: MFC创建属性页详细步骤与注意事项 总的来说,问题在于:创建的时候选错了基类,应该选择下面这种,具体的看上面那一篇吧.

  3. 基础语法篇_7——MFC对话框:逃跑按钮、属性表单、向导创建

  4. MOSS2007中实现表单验证

    MOSS2007中实现表单验证 转自阿喜的Spaces Microsoft Office SharePoint Server 2007 Forms Authentication 本文将演示如何在MOS ...

  5. 在Servlet中处理表单提交的数据

    Servlet的主要功能是处理客户端的表单请求数据,在Servlet中首先对这些数据进行验证,可能会封装到JavaBean,接下来调用数据库的业务逻辑方法将数据保存或者进行其他操作,最后Servlet ...

  6. JavaFX官方教程(五)之在JavaFX中创建表单

    翻译自  在JavaFX中创建表单 在开发应用程序时,创建表单是一项常见活动.本教程将向您介绍屏幕布局的基础知识,如何将控件添加到布局窗格以及如何创建输入事件. 在本教程中,您将使用JavaFX构建如 ...

  7. Python的Django框架中forms表单类的使用方法详解2

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  8. form表单、控制器中接收表单提交数据的4种方式

    Form表单 这篇文章主要讲的是form表单的提交 之前我们接触过的form表单元素是在Bootstrap框架里面,这次也将用到Bootstrap框架去布局(见图表1)通过Bootstrap框架布局呈 ...

  9. extjs 提交表单给php,JavaScript_Extjs学习笔记之二 初识Extjs之Form,Extjs中的表单组件是Ext.form.Basic - phpStudy...

    Extjs学习笔记之二 初识Extjs之Form Extjs中的表单组件是Ext.form.BasicForm,不过最简单最常用的是Ext.form.FormPanel控件,它继承自Panel,具有一 ...

最新文章

  1. 2011寒假-操作系统学习笔记
  2. 我弥留之际 - 许立志 (珍藏)
  3. oracle java_pool_size_总结 Oracle 内存分配和调优
  4. C#垃圾回收机制(GC)
  5. 文档排序--相似度模型--VSM
  6. 论文浅尝 - ACL2020 | 一种用于关系三元组提取的级联二进制标记框架
  7. python cmath模块_python中math模块常用的方法整理
  8. 5 | Spatial-based GNN/convolution模型之DGC
  9. Vue首页加载过慢 解决方案
  10. ios信息交互 协议的使用
  11. 自然语言处理NLP星空智能对话机器人系列:Facebook StarSpace框架案例数据加载
  12. 【Unity3D日常开发】Unity3D中 C#反射Reflection的使用
  13. Servlet的原理和基础使用
  14. 今天不忙,咱们来说说域名是什么意思?
  15. 最值得看的电影,一生必看的50部电影,您看过几部影
  16. 全面升级,你能想象的都在这————京东API接口
  17. 树的结点?结点的度?
  18. 03 KEY BUZZ
  19. 百度竞价排名SEM介绍
  20. 缓解论文写作压力的小妙招

热门文章

  1. 薏米到底有多强大?真是没想到还能这样吃~
  2. php proc open 返回,PHP proc_open多次打开
  3. threejs引擎中 环境光线与管道流动
  4. 另一个角度看Java常量池
  5. cas登录后怎么直接到我们系统_当我们购买服务器后,那么服务器的操作系统该怎么选择呢?...
  6. emqx http not found 怎么回事_幽默笑话:行倒是行,但两个大男人这么说话算怎么回事...
  7. 【ElasticSearch】Es 源码之 DiskThresholdMonitor 源码解读
  8. 60-100-028-使用-MySQL 主从复制
  9. 【分布式ID】键高并发 分布式 全局唯一 ID 雪花算法 snowflake
  10. 【flink】flink http 方式 写入 clickhouse 报错 netty DefaultChannelIId.newInstance