编译环境:VS2010
MFC 应用程序
- 首先建立一个MFC 单文档或多文档应用程序
- 在资源视图->DIalog 右击添加资源如下图1所示
总共添加3个proppage,属性页的 caption 分别改为:Page1 Page2 Page3; ID分别改为IDD_PROP1,IDD_PROP2,IDD_PROP3,Border 都改为“Dialog Frame”
3.1 在Page1 中添加控件设计成如下图所示样式:
将第一个Radio Button 的属性 Group 改为 True
3.2 在Page2 中添加控件设计成如下图所示样式:
将4个check box 的ID 分别改为IDC_Basketball,IDC_Football,IDC_Volleyball,IDC_Swim
3.3 在Page3 中添加控件设计成如下图所示样式:
注意:Combo Box 一定要拉的足够长,不然一会显示内容会显示不全! - 添加三个类分别对应于三个属性页,类名分别叫CProp1,CProp2,CProp3;基类选择CPropertyPage
- 添加属性表单类CPropSheet,基类选择CPropertySheet:
- 在CPropSheet类中添加全局变量:
public:
CProp1 m_prop1;
CProp2 m_prop2;
CProp3 m_prop3;
当然同时得包含3个头文件:
#include "Prop1.h"
#include "Prop2.h"
#include "Prop3.h"
- 在PropSheet 的构造函数中添加:
AddPage(&m_prop1);
AddPage(&m_prop2);
AddPage(&m_prop3);
两个都要加
7. 增加菜单项“属性表单”PopUp 属性改为false ID也改一下
然后在view类中添加事件处理:
void CTryView::OnPropsheet()
{
CPropSheet propSheet("维新属性表单程序");
propSheet.DoModal();
}
点击调试运行,这个时候也许程序会报错:Const Char[] 不能转换成什么什么之类的,反正我的报错了。解决办法是,在解决方案上右击属性改一下,“字符集” 改成 “使用多字符集” :
结果预览:
以上便是属性页的制作,想要做成向导,很简单,只需在OnPropsheet()函数中原先两句代码间加一句代码:
propSheet.SetWizardMode();//变成向导
结果预览:
怎样让利用这些控件和用户交互呢,请看:
- 在CProp1类中添加与listbox相关联的变量CString 类型的 m_workplace ; 还有与Radio1 相关联的成员变量m_occuption:
- 添加虚函数:
LRESULT CProp1::OnWizardNext()
{
UpdateData();//更新数据
if(m_occuption==-1)
{
MessageBox("请选择你的职业");
return -1;
}
if(m_workplace=="")
{
MessageBox("请选择你的工作地点");
return -1;
}
return CPropertyPage::OnWizardNext();
}
BOOL CProp1::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
((CListBox*)GetDlgItem(IDC_LIST1))->AddString("北京");//在listbox里面添加内容
((CListBox*)GetDlgItem(IDC_LIST1))->AddString("天津");
((CListBox*)GetDlgItem(IDC_LIST1))->AddString("上海");
return CPropertyPage::OnSetActive();
}
3.在CProp2中添加与四个check box 相关联的bool型变量:
并添加虚函数OnWizardNext:
LRESULT CProp2::OnWizardNext()
{
UpdateData();//更新数据
if(m_football==true||m_basketball==true||m_volleyball==true||
m_swim==true)
return CPropertyPage::OnWizardNext();
else
{
MessageBox("请选择你的兴趣爱好");
return -1;
}
return CPropertyPage::OnWizardNext();
}
4.在CProp3类中添加虚函数:
BOOL CProp3::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_FINISH);
((CComboBox*)GetDlgItem(IDC_COMBO3))->AddString("1000元以下");
((CComboBox*)GetDlgItem(IDC_COMBO3))->AddString("1000-2000元");
((CComboBox*)GetDlgItem(IDC_COMBO3))->AddString("2000-3000元");
((CComboBox*)GetDlgItem(IDC_COMBO3))->AddString("3000元以上");
((CComboBox*)GetDlgItem(IDC_COMBO3))->SetCurSel(0);//set索引值
return CPropertyPage::OnSetActive();
}
BOOL CProp3::OnWizardFinish()
{
// TODO: 在此添加专用代码和/或调用基类
int index;
index = ((CComboBox*)GetDlgItem(IDC_COMBO3))->GetCurSel();
((CComboBox*)GetDlgItem(IDC_COMBO3))->GetLBText(index,m_salary);
return CPropertyPage::OnWizardFinish();
}
5.回到view类中添加几个全局变量:
protected:
int m_ioccuption;
CString m_strworkplace;
BOOL m_blike[4];
CString m_strsalary;
并附以初值
m_ioccuption=-1;
m_strworkplace="";
memset(m_blike,0,sizeof(m_blike));
m_strsalary="";
6.将OnPropsheet 函数内容改为:
void CTryView::OnPropsheet()
{
CPropSheet propSheet("维新属性表单程序");
propSheet.SetWizardMode();//变成向导
if(ID_WIZFINISH==propSheet.DoModal())
{
m_ioccuption=propSheet.m_prop1.m_occuption;
m_strworkplace=propSheet.m_prop1.m_workplace;
m_blike[0]=propSheet.m_prop2.m_football;
m_blike[1]=propSheet.m_prop2.m_basketball;
m_blike[2]=propSheet.m_prop2.m_volleyball;
m_blike[3]=propSheet.m_prop2.m_swim;
m_strsalary=propSheet.m_prop3.m_sarary;
Invalidate();
}
}
6.在view中添加虚函数ondraw
void CTryView::OnDraw(CDC* pDC/**/)
{
CTryDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CFont font;
font.CreatePointFont(300,"华文行楷");
CFont *pOldFont;
pOldFont=pDC->SelectObject(&font);
CString strTemp;
strTemp="你的职业:";
switch(m_ioccuption)
{
case 0:
strTemp+="程序员";
break;
case 1:
strTemp+="建筑师";
break;
case 2:
strTemp+="会计师";
break;
default:
break;
}
pDC->TextOutA(0,0,strTemp);
strTemp="你的工作地点:";
strTemp+=m_strworkplace;
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
pDC->TextOutA(0,tm.tmHeight,strTemp);
strTemp="你的兴趣爱好:";
if(m_blike[0]==TRUE)
{
strTemp+="篮球 ";
}
if(m_blike[1]==TRUE)
{
strTemp+="足球 ";
}
if(m_blike[2]==TRUE)
{
strTemp+="排球 ";
}
if(m_blike[3]==TRUE)
{
strTemp+="游泳 ";
}
pDC->TextOutA(0,tm.tmHeight*2,strTemp);
strTemp="你的薪资水平:";
strTemp+=m_strsalary;
pDC->TextOutA(0,tm.tmHeight*3,strTemp);
pDC->SelectObject(pOldFont);
}
OK!
最终结果: