属性页对话框就是包含一般属性页对话框和向导对话框两类。它将多个对话框集成于一身,通过标签或按钮来切换页面。点击“计算机/属性/高级系统设置”就可以出现如图1的对话框,这个对话框就是一般属性页对话框,它的每一个选项卡就是一个属性页。一个属性表单由一个或多个属性页组成。它有效解决了大量信息无法在一个对话框上显示,并且还提供了对信息的分类和组织管理功能。属性表单涉及到MFC中的两个类:CPropertySheet和CPropertyPage。
图1 属性表单
我们首先创建一个基于MFC对话框模式的工程,这里命名为Property,现在说明属性表单创建过程:
添加CpropertySheetDlg类
我们在工程名上右击鼠标,选择添加类,在向导的指引下完成属性表单对象的添加,我们将新类命名为CpropertySheetDlg,并选择基类为CPropertySheet,如图2所示。
添加属性页
- 创建属性页对话框资源
步骤:添加/资源/选择Dialog下的IDD_PROPPAGE_LAGE/新建,在这里我们选择创建两个属性页对话框,控件的绑定这里不再介绍,属性页如下图所示。
- 绑定属性页类
我们现在分别为这两个对话框资源与对应的类绑定,通过“点击对话框资源/添加类”根据向导提示完成类的绑定,基类为CPropertyPage,两个子类分别是COccupationPage和CSallaryPage。
我们在CSallaryPage类中的重写OnInitDialog函数,在该函数中完成CComboBox控件信息初始化,具体代码如下:
BOOL CSallaryPage::OnInitDialog() { CPropertyPage::OnInitDialog(); m_ComboxSallary.AddString("6000-7000元"); m_ComboxSallary.AddString("7000-9000元"); m_ComboxSallary.AddString("9000-12000元"); m_ComboxSallary.SetCurSel(0); //默认选择第一个 // TODO: 在此添加额外的初始化 return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE }
由于默认的对话框带帮助按钮,如果不需要可以在属性页和属性表单的默认构造函数中,修改dwFlags完成样式的修改,修改代码如下:
COccupationPage::COccupationPage() : CPropertyPage(COccupationPage::IDD) { m_psp.dwFlags &= ~PSP_HASHELP; //删除帮助按钮 }
CSallaryPage::CSallaryPage() : CPropertyPage(CSallaryPage::IDD) { m_psp.dwFlags &= ~(PSP_HASHELP); //删除帮助按钮 }
- 添加属性页
在属性页表单对象中添加属性页,这里需要调用CpropertySheet类的AddPage成员函数,其函数声明如下:
void Addpage( CPropertyPage *pPage );
Addpage的入参就是属性页指针,不能为空。我们可在属性页表单对象的构造函数中完成对属性页的添加和样式修改,具体代码如下:
CPropertySheetDlg::CPropertySheetDlg(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(nIDCaption, pParentWnd, iSelectPage) { AddPage(&m_WorkPage); //添加职位属性页 AddPage(&m_SallayPage); //添加工资水平属性页 m_psh.dwFlags &= ~PSH_HASHELP; //属性表单样式设置(无帮助按钮) m_psh.dwFlags |= PSH_NOAPPLYNOW; //属性表单样式设置(无应用按钮) }
显示属性表单
我们在工程对话框资源上添加一个Button控件,并添加按钮响应函数,用于触发属性页对话框的生成,具体代码如下:
void CPropertyDlg::OnBnClickedCreateProperty() { // TODO: 在此添加控件通知处理程序代码 CPropertySheetDlg PropertySheet("属性页表单"); PropertySheet.DoModal(); }运行效果: