MFC 笔记(二)属性页和向导的创建

编译环境:VS2010
MFC 应用程序

  1. 首先建立一个MFC 单文档或多文档应用程序
  2. 在资源视图->DIalog 右击添加资源如下图1所示
    图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 一定要拉的足够长,不然一会显示内容会显示不全!
  3. 添加三个类分别对应于三个属性页,类名分别叫CProp1,CProp2,CProp3;基类选择CPropertyPage
    在这里插入图片描述
  4. 添加属性表单类CPropSheet,基类选择CPropertySheet:
    在这里插入图片描述
  5. 在CPropSheet类中添加全局变量:
public:
	CProp1 m_prop1;
	CProp2 m_prop2;
	CProp3 m_prop3;

当然同时得包含3个头文件:

#include "Prop1.h"
#include "Prop2.h"
#include "Prop3.h"
  1. 在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();//变成向导

结果预览:
在这里插入图片描述
怎样让利用这些控件和用户交互呢,请看:

  1. 在CProp1类中添加与listbox相关联的变量CString 类型的 m_workplace ; 还有与Radio1 相关联的成员变量m_occuption:
    在这里插入图片描述
  2. 添加虚函数:在这里插入图片描述
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!
最终结果:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值