属性页编程

来源:互联网 发布:企业管理网络培训 编辑:程序博客网 时间:2024/06/05 03:26
下面做一个示例:
先在资源编辑器添加三个属性页:
添加方式:Dialog->添加资源->Dialog->IDD_PROPERPAGE_LARGE
三个属性页设计如下:
ID_PROPERPAGE1:
属性页编程 - andylanzhiyong - C++学习
 
ID_PROPERPAGE2:(第一个单选按钮需设置Group属性True)
属性页编程 - andylanzhiyong - C++学习
 
ID_PROPERPAGE3:
属性页编程 - andylanzhiyong - C++学习
 
类向导为每个属性页添加类
对应类为:CProp1,CProp2,CProp3,均继承自CPropertPage

接下来添加一个属性页表单类CPropSheet,继承自CPropertSheet
给CPropSheet添加三个变量(属性页对象):
public:
CProp1 m_prop1;
CProp2 m_prop2;
CProp3 m_prop3;

在CPropSheet类的两个构造函数中加载三个属性页:
CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
AddPage(&m_prop1);
AddPage(&m_prop2);
AddPage(&m_prop3);
}

CPropSheet::CPropSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPage(&m_prop1);
AddPage(&m_prop2);
AddPage(&m_prop3);
}

CProp2列表框中添加数据,
类向导添加虚函数:OnInitDiaglog()   (VC中为消息)
BOOL CProp2::OnInitDialog()
{
CPropertyPage::OnInitDialog();

// TODO:  在此添加额外的初始化
((CListBox*)GetDlgItem(IDC_LIST_ADDR))->AddString("北京");
((CListBox*)GetDlgItem(IDC_LIST_ADDR))->AddString("天津");
((CListBox*)GetDlgItem(IDC_LIST_ADDR))->AddString("上海");
return TRUE;  // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

CProp3组合框中添加数据,
类向导添加虚函数:OnInitDiaglog()   (VC中为消息)
BOOL CProp3::OnInitDialog()
{
CPropertyPage::OnInitDialog();

// TODO:  在此添加额外的初始化

((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->AddString("1000元以下");
((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->AddString("1000-2000元");
((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->AddString("2000-3000元");
((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->AddString("3000元以上");
//设置默认选择项为第一项
((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->SetCurSel(0);

return TRUE;  // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

在菜单上添加一个菜单项,ID为ID_Propsheet.
单击该菜单项显示属性表单。为它添加命令响应函数

void CTest0610BView::OnPropsheet()
{
// TODO: 在此添加命令处理程序代码

//生成一个属性表单,标题"选择属性"
CPropSheet propSheet(_T("选择属性"));
//设置向导模式
propSheet.SetWizardMode();
//以模态对话框显示
propSheet.DoModal();
}

运行效果如图:
属性页编程 - andylanzhiyong - C++学习
 
属性页编程 - andylanzhiyong - C++学习
 
以上结果有点问题:
第一页应该没有“上一步”按钮
最后一页应该没有“下一步”按钮,应该是“完成”按钮
接下来处理:
类向导为CProp1添加虚函数:SetActive  (VC中为消息)
BOOL CProp1::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
//设置只有一个“下一步”按钮
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}

BOOL CProp3::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
//设置“上一步” “完成”按钮
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
return CPropertyPage::OnSetActive();
}


接下来完成一个功能,每个属性页点击“下一步”时,用户要已经选择了项
首先:
为CProp1的复选按钮控件关联变量
BOOL m_bFootball;
BOOL m_bBasketball;
BOOL m_bSwim;
BOOL m_bRead;

为CProp2的单选选按钮、列表框控件关联变量
CString m_strAddr;
int m_nWork;     //初始值改为-1,编辑器默认给它赋0(0为选择了第一项)

为CProp3的组合框控件关联变量
CString m_strSalary;

类向导为CProp1,CProp2添加虚函数:OnWizardNext()    (VC中为消息)

LRESULT CProp1::OnWizardNext()
{
// TODO: 在此添加专用代码和/或调用基类

UpdateData();   //更新数据
if(m_bFootball || m_bBasketball || m_bSwim || m_bRead)
{
return CPropertyPage::OnWizardNext();
}
else
{
MessageBox("请选择你的兴趣爱好!");
return -1;
}
}

LRESULT CProp2::OnWizardNext()
{
// TODO: 在此添加专用代码和/或调用基类
UpdateData();
if(m_nWork==-1)
{
MessageBox("请选择你的职业!");
return -1;
}
if(m_strAddr=="")
{
MessageBox("请选择你的工作地点!");
return -1;
}
return CPropertyPage::OnWizardNext();
}

类向导为CProp3添加虚函数:OnWizardFinish()    (VC中为消息)
BOOL CProp3::OnWizardFinish()
{
// TODO: 在此添加专用代码和/或调用基类
int index;
index=((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->GetCurSel();
((CComboBox*)GetDlgItem(IDC_COMBO_SALARY))->GetLBText(index,m_strSalary);
return CPropertyPage::OnWizardFinish();
}

最后实现一个功能:把用户在属性页选择的数据在View显示
首先给View类添加几个变量接收用户在属性页选择的数据
private:
int m_work;
CString m_salary;
CString m_addr;
BOOL m_hoby[4];

构造函数中初始化:
m_work=-1;
m_salary="";
 m_addr="";
memset(m_hoby,0,sizeof(m_hoby));

当用户在属性页最后一页按下“完成按钮”后,保存选择的数据
在View中处理这一消息:
void CTest0610BView::OnPropsheet()
{
// TODO: 在此添加命令处理程序代码
CPropSheet propSheet(_T("选择属性"));
propSheet.SetWizardMode();
//如果用户按下“完成”按钮
if(ID_WIZFINISH==propSheet.DoModal())
{
//保存选择的数据
m_hoby[0]=propSheet.m_prop1.m_bFootball;
m_hoby[1]=propSheet.m_prop1.m_bBasketball;
m_hoby[2]=propSheet.m_prop1.m_bSwim;
m_hoby[3]=propSheet.m_prop1.m_bRead;

m_work=propSheet.m_prop2.m_nWork;
m_addr=propSheet.m_prop2.m_strAddr;

m_salary=propSheet.m_prop3.m_strSalary;
//擦除背景,触发OnDraw
Invalidate();
}
}

在View的OnDraw()中显示得到的数据:
void CTest0610BView::OnDraw(CDC* pDC)
{
CTest0610BDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

CString str="你的爱好:";
if(m_hoby[0])
str+="足球 ";
if(m_hoby[1])
str+="篮球 ";
if(m_hoby[2])
str+="游泳 ";
if(m_hoby[3])
str+="看书 ";
pDC->TextOutA(0,0,str);

str="你的职位:";
switch(m_work)
{
case 0:
str+="程序员:";
break;
case 1:
str+="经理:";
break;
case 2:
str+="业务";
break;
default:
break;
}
pDC->TextOutA(0,20,str);

str="工作地点";
str+=m_addr;
pDC->TextOutA(0,40,str);

str="薪水范围:";
str+=m_salary;
pDC->TextOutA(0,60,str);

// TODO: 在此处为本机数据添加绘制代码
}









 

原创粉丝点击