MFC属性页示例

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值