1、制作属性页面
属性页面CPropertyPage继承自CDialog。因此,设计属性页面同设计对话框是一致的,通过资源视图,添加属性页面的资源设计。注意:由于属性页面的是同一个框体,因此,需要将它的style属性设置为child。如果这些页面大小不一致,由最大的页面作为框体大小。
设置Group为true表示一组,直到下一个Group为true,这两个控件的Tab order之间的所有控件为一组。(基于Group标记,和Tab Order来分组)
2 、添加菜单设计
3、添加属性页的类
为每个属性页添加类,CPage1,CPage2,CPage3,确保这些类继承自CPropertyPage,并对应好自己的ID资源号
4、为每个控件添加相应的成员变量
添加变量的时候,注意选择变量的类型,变量的名称,这会自动生成DDX_Text(pDX, IDC_EDIT_NAME, m_name);之类的成员变量和控件的映射。通常,需要用手工的方式进行调整和修改。
CPage1::CPage1()
: CPropertyPage(CPage1::IDD)
, m_name(_T(""))
, m_age(_T(""))
, m_sex(0)
{
}
CPage1::~CPage1()
{
}
void CPage1::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_NAME, m_name);
DDX_Text(pDX, IDC_EDIT_AGE, m_age);
DDX_CBIndex(pDX, IDC_COMBO_SEX, m_sex);
DDV_MinMaxInt(pDX, m_sex, 0, 1);
}
CPage2::CPage2()
: CPropertyPage(CPage2::IDD)
{
}
CPage2::~CPage2()
{
}
void CPage2::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
DDX_Check(pDX, IDC_CHK_TBLTENNIS, m_tbltennis);
DDX_Check(pDX, IDC_CHK_BSKBALL, m_bskball);
DDX_Check(pDX, IDC_CHK_SWIM, m_swim);
DDX_Check(pDX, IDC_CHK_TENNIS, m_tennis);
}
CPage3::CPage3()
: CPropertyPage(CPage3::IDD)
, m_job(0)
, m_city(_T(""))
{
}
CPage3::~CPage3()
{
}
void CPage3::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
DDX_Radio(pDX, IDC_RAD_PRO, m_job);
DDX_LBString(pDX, IDC_LIST_CITY, m_city);
}
5、重载每个CPage页的OnInitDialog方法以对控件数据进行初始化
OnInitDialog重载函数无法通过类向导对话框和事件处理向导完成,需要手动在头文件中添加,然后通过VassistX创建Implementation
BOOL CPage1::OnInitDialog()
{
CPropertyPage::OnInitDialog();
((CComboBox*)GetDlgItem(IDC_COMBO_SEX))->SetCurSel(1);
return TRUE;
}
//************************************
// Method: OnInitDialog
// FullName: CPage2::OnInitDialog
// Access: protected
// Returns: BOOL
// Qualifier:
//************************************
BOOL CPage2::OnInitDialog()
{
return TRUE;
}
//************************************
// Method: OnInitDialog
// FullName: CPage3::OnInitDialog
// Access: protected
// Returns: BOOL
// Qualifier:
//************************************
BOOL CPage3::OnInitDialog()
{
CPropertyPage::OnInitDialog();
//将城市信息添加到列表框
CString strArr[]={_T("杭州"),_T("北京"),_T("天津"),_T("南京"),_T("上海")};
for (int i=0;i<5;i++)
{
((CListBox *)GetDlgItem(IDC_LIST_CITY))->AddString(strArr[i]);
}
//高亮显示第一条信息
((CListBox*)GetDlgItem(IDC_LIST_CITY))->SetCurSel(0);
((CButton*)GetDlgItem(IDC_RAD_PRO))->SetCheck(1);
return TRUE;
}
6、在View中收集向导数据,并显示在View上
首先,在View中定义相应需要收集的成员变量,通常与页面变量保持一致。
然后,在View中添加菜单命令的事件响应处理,代码如下所示
void CDialog2View::OnProp()
{
// TODO: 在此添加命令处理程序代码
CPropertySheet propertySheet;
CPage1 page1;
CPage2 page2;
CPage3 page3;
propertySheet.AddPage(&page1);
propertySheet.AddPage(&page2);
propertySheet.AddPage(&page3);
if (propertySheet.DoModal()==IDOK)
{
CClientDC dc(this);
CString output;
//获取第一页中数据并显示
m_age = page1.m_age;
m_name = page1.m_name;
page1.m_sex==0?m_sex = "男":m_sex = "女";
if (m_name.IsEmpty())
{
AfxMessageBox(_T("您没有输入姓名,不能显示"));
return ;
}
output.Format(_T("您的姓名是:%s,年龄是:%s,性别是:%s"),m_name,m_age,m_sex);
dc.TextOutW(0,0,output);
//获取第二页中数据并显示
output=_T("您的爱好是:");
if (page2.m_tbltennis)
output.Append(_T("乒乓球"));
if (page2.m_swim)
output.Append(_T("游泳"));
if (page2.m_tennis)
output.Append(_T("网球"));
if (page2.m_bskball)
output.Append(_T("篮球"));
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
dc.TextOutW(0,tm.tmHeight,output);
//获取第三页中数据并显示
output=_T("职务:");
switch (page3.m_job)
{
case 0:output.Append(_T("程序员"));break;
case 1:output.Append(_T("软件设计师"));break;
case 2:output.Append(_T("系统分析师"));break;
default:"";
}
m_city=page3.m_city;
output.Append(_T("工作地点:"));
output.Append(m_city);
dc.TextOutW(0,2*tm.tmHeight,output);
}
}