属性页编写总体思路
大体思想:
设置对话框属性页属性:
属性名 值
System Menu False
Style Child
Title Bar False
Border None
代码样例(这里我一几个按钮控件来演示):
添加两个对话框资源并为对话框资源定义相关属性,资源 ID 为IDD_PAGE1,IDD_PAGE2,资源视图如下所示:
为主对话框添加相关成员变量(属性页关联对象,CDialog 数组指针,当前显示标签页的索引)代码如下:

在主对话框的 OnInitDialog 函数中初始化属性页相关操作,添加的具体代码如下:

然后为对话框添加两个按钮并通过这个两个按钮的事件响应函数来实现属性页的切换,具体代码如下:

运行结果:
CPropertySheet 编程
对话框属性页资源
普通对话框资源和属性页资源对话框的区别:
选项 普通对话框 属性页对话框
Style Popup Child
Border Dialog Thin
System menu 选中 未选中
可以把普通对话框按照上面修改便可以称为属性页对话框
创建对话框属性页资源
编写CPropertySheet流程图:
代码样例:
属性页模式
创建两个属性页资源 ID 为 IDD_PAGE1 与 IDD_PAGE2,并关联两个 CPropertyPage 派生类,类分别为 CPage1,CPage2.资源视图如下:
CPage1 与 CPage2 源码:

在工程中添加一个派生于 CPropertySheet 类,这里我不它命名为 CMyProSh,然后在 CMyProSh 中添加 CPage1,CPage2 对象作为其成员变量,并在构造函数中用 AddPage 函数把 CPage1,CPage2 对象添加到属性表单中去.CMyProSh 程序源码如下:

在主对话框中添加一个按钮然后为按钮添加事件响应函数,在函数中添加如下代码:
//创建表单类对象 CMyProSh pro(L"表单样例"); //显示模态表单对话框 pro.DoModal();
运行结果:
向导模式:
相关函数:
- CPropertySheet::SetWizardButtons
- CPropertySheet::SetWizardMode
- CPropertyPage::OnWizardBack
- CPropertyPage::OnWizardFinish
- CPropertyPage::OnWizardNext
代码样例:
在创建模态对话框前的步骤与属性页模式一致.但在调用 DoModal 函数创建模态对话框前需要先调用 SetWizardMode 成员函数.代码如下:

运行结果:
Tab Control 控件
说明:
Tab Control 的运行效果有点像 Property Sheet,但两者还是有一些区别.我的理解就是Property Sheet主要用在对话框中,对数据进行进行分类管理.而 Tab Control 使用范围更广一些,既可以用在对话框,也可以用在视图中,除了可以管理配置数据外,还可以对软件的组织进行规划,比如可以通过它来切换不同的视图等等,当然这不是没有代价的,Tab Control 的编程就比 Property Sheet 的复杂很多.但是不是每个 Tab Control 的标签页对应一个页面
对于客户区其实只有一个,工作原理其实就是有许多的子对话框在客户区上但是只有一个显示而其他的都没有显示通过按标签页后相应事件让现在显示的子对话框隐藏而对应于标签页索引的某个子对话框显示
相关函数:
CTabCtrl 类成员函数

CWnd 类成员函数

编写流程图:
代码样例:
在对话框上建立一个 Tab Control 控件,然后为控件添加关联的控制变量,并为变量命名为 m_tab.资源对话如下图所示:
添加两个对话框资源并为对话框资源定义相关属性,资源 ID 为IDD_PAGE1,IDD_PAGE2,资源视图如下所示:
为主对话框添加相关成员变量(属性页关联对象,CDialog 数组指针,当前显示标签页的索引)代码如下:

在主对话框的 OnInitDialog 函数中初始化 Tab Control 控件,即在 OnInitDialog 函数中添加一下代码:

为 Tab Control 控件添加响应标签页选择改变事件( 即 TCN_SELCHANGE 事件),然后在事件响应函数中添加切换属性页操作,相关代码如下:

运行结果: