MFC属性页示例

来源:互联网 发布:淘宝消保工具是什么 编辑:程序博客网 时间:2024/05/22 06:43

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);}}


原创粉丝点击