下面做一个示例:
以上结果有点问题:
先在资源编辑器添加三个属性页:
添加方式:Dialog->添加资源->Dialog->IDD_PROPERPAGE_LARGE
三个属性页设计如下:
ID_PROPERPAGE1:
ID_PROPERPAGE2:
(第一个单选按钮需设置Group属性True)
ID_PROPERPAGE3:
类向导为每个属性页添加类
对应类为:CProp1,CProp2,CProp3,均继承自CPropertPage
接下来添加一个属性页表单类CPropSheet,继承自CPropertSheet
给CPropSheet添加三个变量(属性页对象):
public:
CProp1 m_prop1;
CProp2 m_prop2;
CProp3 m_prop3;
在CPropSheet类的两个构造函数中加载三个属性页:
CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
AddPage(&m_prop1);
AddPage(&m_prop2);
AddPage(&m_prop3);
}
CPropSheet::CPropSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPage(&m_prop1);
AddPage(&m_prop2);
AddPage(&m_prop3);
}
CProp2列表框中添加数据,
类向导添加虚函数:OnInitDiaglog() (VC中为消息)
BOOL CProp2::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: 在此添加额外的初始化
((CListBox*)GetDlgItem(IDC_LIST_ADDR))->AddString("北京");
((CListBox*)GetDlgItem(IDC_LIST_ADDR))->AddString("天津");
((CListBox*)GetDlgItem(IDC_LIST_ADDR))->AddString("上海");
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
CProp3组合框中添加数据,
类向导添加虚函数:OnInitDiaglog() (VC中为消息)
BOOL CProp3::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: 在此添加额外的初始化
((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->AddString("1000元以下");
((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->AddString("1000-2000元");
((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->AddString("2000-3000元");
((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->AddString("3000元以上");
//设置默认选择项为第一项
((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
在菜单上添加一个菜单项,ID为ID_Propsheet.
单击该菜单项显示属性表单。为它添加命令响应函数
void CTest0610BView::OnPropsheet()
{
// TODO: 在此添加命令处理程序代码
//生成一个属性表单,标题"选择属性"
CPropSheet propSheet(_T("选择属性"));
//设置向导模式
propSheet.SetWizardMode();
//以模态对话框显示
propSheet.DoModal();
}
运行效果如图:
第一页应该没有“上一步”按钮
最后一页应该没有“下一步”按钮,应该是“完成”按钮
接下来处理:
类向导为CProp1添加虚函数:SetActive (VC中为消息)
BOOL CProp1::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
//设置只有一个“下一步”按钮
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
BOOL CProp3::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
//设置“上一步” “完成”按钮
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
return CPropertyPage::OnSetActive();
}
接下来完成一个功能,每个属性页点击“下一步”时,用户要已经选择了项
首先:
为CProp1的复选按钮控件关联变量
BOOL m_bFootball;
BOOL m_bBasketball;
BOOL m_bSwim;
BOOL m_bRead;
为CProp2的单选选按钮、列表框控件关联变量
CString m_strAddr;
int m_nWork;
//初始值改为-1,编辑器默认给它赋0(0为选择了第一项)
为CProp3的组合框控件关联变量
CString m_strSalary;
类向导为CProp1,CProp2添加虚函数:OnWizardNext() (VC中为消息)
LRESULT CProp1::OnWizardNext()
{
// TODO: 在此添加专用代码和/或调用基类
UpdateData();
//更新数据
if(m_bFootball || m_bBasketball || m_bSwim || m_bRead)
{
return CPropertyPage::OnWizardNext();
}
else
{
MessageBox("请选择你的兴趣爱好!");
return -1;
}
}
LRESULT CProp2::OnWizardNext()
{
// TODO: 在此添加专用代码和/或调用基类
UpdateData();
if(m_nWork==-1)
{
MessageBox("请选择你的职业!");
return -1;
}
if(m_strAddr=="")
{
MessageBox("请选择你的工作地点!");
return -1;
}
return CPropertyPage::OnWizardNext();
}
类向导为CProp3添加虚函数:OnWizardFinish() (VC中为消息)
BOOL CProp3::OnWizardFinish()
{
// TODO: 在此添加专用代码和/或调用基类
int index;
index=((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->GetCurSel();
((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->GetLBText(index,m_strSalary);
return CPropertyPage::OnWizardFinish();
}
最后实现一个功能:把用户在属性页选择的数据在View显示
首先给View类添加几个变量接收用户在属性页选择的数据
private:
int m_work;
CString m_salary;
CString m_addr;
BOOL m_hoby[4];
构造函数中初始化:
m_work=-1;
m_salary="";
m_addr="";
memset(m_hoby,0,sizeof(m_hoby));
当用户在属性页最后一页按下“完成按钮”后,保存选择的数据
在View中处理这一消息:
void CTest0610BView::OnPropsheet()
{
// TODO: 在此添加命令处理程序代码
CPropSheet propSheet(_T("选择属性"));
propSheet.SetWizardMode();
//如果用户按下“完成”按钮
if(ID_WIZFINISH==propSheet.DoModal())
{
//保存选择的数据
m_hoby[0]=propSheet.m_prop1.m_bFootball;
m_hoby[1]=propSheet.m_prop1.m_bBasketball;
m_hoby[2]=propSheet.m_prop1.m_bSwim;
m_hoby[3]=propSheet.m_prop1.m_bRead;
m_work=propSheet.m_prop2.m_nWork;
m_addr=propSheet.m_prop2.m_strAddr;
m_salary=propSheet.m_prop3.m_strSalary;
/
/擦除背景,触发OnDraw
Invalidate();
}
}
在View的OnDraw()中显示得到的数据:
void CTest0610BView::OnDraw(CDC* pDC)
{
CTest0610BDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CString str="你的爱好:";
if(m_hoby[0])
str+="足球 ";
if(m_hoby[1])
str+="篮球 ";
if(m_hoby[2])
str+="游泳 ";
if(m_hoby[3])
str+="看书 ";
pDC->TextOutA(0,0,str);
str="你的职位:";
switch(m_work)
{
case 0:
str+="程序员:";
break;
case 1:
str+="经理:";
break;
case 2:
str+="业务";
break;
default:
break;
}
pDC->TextOutA(0,20,str);
str="工作地点";
str+=m_addr;
pDC->TextOutA(0,40,str);
str="薪水范围:";
str+=m_salary;
pDC->TextOutA(0,60,str);
// TODO: 在此处为本机数据添加绘制代码
}