一:属性页对话框
属性页对话框包括一般属性页对话框和向导对话框;共同特点是集多个对话框于一身,一般属性页对话框通过标签来回切换,而向导对话框通过按钮来回切换;
创建属性页常用的两个类是CPropertyPage类和CPropertySheet类,CPropertyPage类表示单个属性页面,后者表示整体属性对话框;大家可以在MSDN中详细了解这两个类;
二:创建向导对话框
1:首先创建一个基于对话框的MFC程序,在资源里insert三个对话框表示属性页面,但是对话框的属性要重新设置:style为child类型,border为thin类型;
这里介绍一下三种dialog style类型:
child 类型:子窗口,子窗口只能出现在另一个窗口之中,子窗口多余的部分会被裁剪;而且子窗口不能含有菜单栏;
popup类型:弹出式窗口,通常以对话框和消息框的形式与用户对话;可以没有标题栏;
overlapped类型,重叠式窗口,通常用于应用程序主窗口;
border类型为边界类型;none;thin;resizing和dialog frame,一般都用dialog frame;
2:然后给每一个对话框添加一个类,基类是CPropertyPage;CPage_1;CPage_2;CPage_3,添加完类之后,重写OnSetActive()函数
BOOL CPage_1::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
CPropertySheet* psheet = (CPropertySheet*)GetParent(); //得到父类窗口的指针;
psheet->SetWizardButtons(PSWIZB_NEXT); //有一个下一步按钮;
return CPropertyPage::OnSetActive();
}
BOOL CPage_2::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
CPropertySheet* psheet = (CPropertySheet*)GetParent();
psheet->SetWizardButtons(PSWIZB_BACK|PSWIZB_NEXT); //有上一步和下一步按钮;
return CPropertyPage::OnSetActive();
}
BOOL CPage_3::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
CPropertySheet* psheet = (CPropertySheet*)GetParent();
psheet->SetWizardButtons(PSWIZB_BACK|PSWIZB_FINISH); //上一步和完成按钮
return CPropertyPage::OnSetActive();
}
3:有了三个属性页面之后,还需要一个属性表来包含他们,即需要在类视图中添加一个继承CPropertySheet的类CProSheet;同时需要包含三个属性页的头文件,创建三个属性页对象;
#pragma once
#include"Page_1.h"
#include"Page_2.h"
#include"Page_3.h"
// CProSheet
class CProSheet : public CPropertySheet
{
DECLARE_DYNAMIC(CProSheet)
public:
CProSheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
CProSheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
virtual ~CProSheet();
protected:
DECLARE_MESSAGE_MAP()
public:
CPage_1 page_1; //创建三个属性页对象;
CPage_2 page_2;
CPage_3 page_3;
};
4:在CProSheet的构造函数中初始化属性表单,把三个属性页面添加到属性表单;
CProSheet::CProSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
AddPage(&page_1);
AddPage(&page_2);
AddPage(&page_3);
}
CProSheet::CProSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPage(&page_1);
AddPage(&page_2);
AddPage(&page_3);
}
5:最后,在button上添加消息响应函数;单击该button时就会弹出该属性表;void CProPageDlg::OnBnClickedPage()
{
// TODO: 在此添加控件通知处理程序代码
CProSheet sheet(_T(""));
sheet.SetWizardMode(); //以向导的形式显示;
sheet.DoModal();
}