CPropertyPage类是属性页类,相当于每一个类就是一个对话框.它继承自CDialog类.
CPropertySheet类是属性表类,它有多个属性页.它继承自CWnd类
创建属性表步骤如下:
这里简单的以只有两个属性页的属性表为例子.
1.创建一个主对话框.
如图:
2.在资源中创建一个菜单
如图:
3.给菜单添加事件处理程序
如图:
4.在主对话框属性中添加菜单
如图:
5.添加两个对话框作为属性页
如图:
需要注意的是,对话框外框最好设置为thin(MSDN说的),不过我测试的时候感觉看不出什么问题…
还有对话框标题就是属性页的标题,下面会有截图,继续往下看就行.
6.分别给两个对话框(属性页)添加类
需要特别注意! 基类的选择必须是CPropertyPage.
如图:
7.添加一个自己的属性表类
特别注意的是,这个类要继承自CPropertySheet
这里添加的类不是简单的C++类,而是MFC类!
如图:
8.在CMyPropertySheet头文件中添加两个属性页变量
如图:
9.在CMyPropertySheet两个构造函数中向属性表中添加两个属性页
如图:
10.到了这一步,属性表已经创建出来了,让我们去打开看看效果如何.
我们是通过菜单方式打开一个属性表.所以要在菜单事件处理那里填写代码.
代码如下:
void CMFCCPropertySheetDlg::OnProperty()
{
//第一个参数是属性表的标题
CMyPropertySheet mypsheet(TEXT("属性表"));
//打开模态对话框,就是属性表
mypsheet.DoModal();
}
效果如图:
上面的”确定” “取消” “应用” “帮助”按钮都是自动生成的,基类都已经实现好了它们的代码.但是”应用”按钮需要自己编写相应的事件处理,下面会有讲到方法.
11.接下就是在各自的属性页中实现控件的功能.
点击属性页1按钮就弹出一个消息框.
如图:
12.使应用按钮有效.
可以在改变了属性页里面的内容的时候使其有效.
方法如下:
添加单选按钮事件处理
代码如下:
void CPage1::OnBnClickedRadio1()
{
SetModified(TRUE);
//其它代码
//......
}
为了方便,多个按钮响应同一个消息
ON_BN_CLICKED(IDC_RADIO1, &CPage1::OnBnClickedRadio1)
ON_BN_CLICKED(IDC_RADIO2, &CPage1::OnBnClickedRadio1)
ON_BN_CLICKED(IDC_RADIO3, &CPage1::OnBnClickedRadio1)
13.响应应用按钮消息
CPropertyPage类中有一个OnApply函数.它的ID是ID_APPLY_NOW,消息映射的时候,这个ID不能变,函数名可以自己再起一个.
首先先进行消息映射
ON_BN_CLICKED(ID_APPLY_NOW, CMyPropertySheet::OnApply)
然后在头文件中声明
afx_msg void OnApply();
最后写函数体实现
void CMyPropertySheet::OnApply()
{
AfxMessageBox(TEXT("点击了应用按钮"));
m_Page1.SetModified(FALSE); //使应用按钮无效
m_Page2.SetModified(FALSE);
//按下应用的时候更新页面的数据
GetActivePage()->UpdateData(TRUE);
//接下来可以SendMessage给其它函数来执行更新后的操作
}