每次在使用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这个时候我们可以根据返回值来判断是否保存;

MFC中属性表单和向导对话框的使用的更多相关文章

  1. html5中form表单新增属性以及改良的input标签元素的种类

    在HTML5中,表单新增了一些属性,input标签也有了更多的type类型,有些实现了js才能实现的特效,但目前有些浏览器不能全部支持.下面是一些h5在表单和input标签上的一些改动. <!D ...

  2. AngularJS中的表单验证

    AngularJS中的表单验证 AngularJS自带了很多验证,什么必填,最大长度,最小长度...,这里记录几个有用的正则式验证 1.使用angularjs的表单验证 正则式验证 只需要配置一个正则 ...

  3. MVC中Form表单的提交

    概述 Web页面进行Form表单提交是数据提交的一种,在MVC中Form表单提交到服务器.服务端接受Form表单的方式有多种,如果一个Form有2个submit按钮,那后台如何判断是哪个按钮提交的数据 ...

  4. Excel中的表单控件和active控件

    EXCEL中有两种控件:表单控件和active控件 表单控件是excel5和excel95开始使用的,从excel97开始,active控件开始出现 关于表单控件和active控件的区别和使用范围,网 ...

  5. YII中的表单挂件

    利用助手(widget)在页面实现表单 控制器中 <?php class YiiFormController extends Controller { public function actio ...

  6. django中form表单的提交:

    一,关于表单: 表单在百度百科的解释:   表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单域 ...

  7. flask 在视图函数中验证表单

    在视图函数中验证表单 因为现在的basic_form视图同时接受两种类型的请求:GET请求和POST请求.所以我们要根据请求方法的不同执行不同的代码.具体来说,首先是实例化表单,如果是GET请求,就渲 ...

  8. flask 在模板中渲染表单

    在模板中渲染表单 为了能够在模板中渲染表单,我们需要把表单类实例传入模板.首先在视图函数里实例化表单类LoginForm,然后再render_template()函数中使用关键脑子参数form将表单实 ...

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

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

随机推荐

  1. Android 夜间模式changeskin小结

    @author vivian8725118 @CSDN http://blog.csdn.net/vivian8725118 @简书 http://www.jianshu.com/p/832e9776 ...

  2. MPSOC之6——开发流程linux编译

    0.顶层Makefile增加交叉编译器 顶层makefile: ARCH ?= $(SUBARCH) CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%&q ...

  3. 把项目放到码云上,通过git 进行项目管理

    1.在码云上新建一个项目 把使用 Readme文件初始化这个项目这个勾选去掉  项目生成后会看到 码云的git 简易的命令行入门教程: Git 全局设置: git config --global us ...

  4. .NET 实现Base-64加密解密处理

    .NET 实现Base-64加密解密处理 using System; using System.Collections.Generic; using System.Linq; using System ...

  5. Android查缺补漏--Service和IntentService

    Service的运行不依赖界面,即使程序被切换到后台,Service仍然能够保持正常运行.当某个应用程序进程被杀掉时,所有依赖于该进程的Service也会停止运行. Service 分为启动状态和绑定 ...

  6. Grafana4.2安装

    一.文件准备 1.1 文件名称 grafana-4.2.0-1.x86_64.rpm 1.2 下载地址 https://grafana.com/grafana/download 二.工具准备 2.1 ...

  7. 《代码大全(第二版)》【PDF】下载

    <代码大全(第二版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382264 内容简介 <代码大全(第2版)>是著 ...

  8. Java IO学习要点导图

    Java IO的一些基础知识: 导图源文件保存地址:https://github.com/wanghaoxi3000/xmind

  9. JavaSE项目之聊天室

    引子: 当前,互联网 体系结构的参考模型主要有两种,一种是OSI参考模型,另一种是TCP/IP参考模型. 一.OSI参考模型,即开放式通信系统互联参考模型(OSI/RM,Open Systems In ...

  10. linux集群批量执行命令

    因为工作需要,需要修改集群中机器的配置,一台一台的修改太浪费时间,就想能不能通过自动化脚本批量执行命令,尝试写一个,自己shell不熟悉,写的有点渣渣 if [ "$#" -ne ...