属性表单——向导的创建
Controler
1、 通过设计一个向导来学会灵活运用类
首先这个程序需要建的类如类视图:(红色框类由用户自行添加)
通过3次“添加资源”,“+Dialog”中选择“IDD_PROPPAGE_LARGE”来添加(“新建”)属性页资源。构建新类:
CProp1:CPropertyPage针对第一个属性页;
CProp2:CPropertyPage针对第二个属性页;
CProp3:CPropertyPage针对第三个属性页;
为了将三个属性页组织起来需要建设新类
CPropSheet:CPropertySheet 针对属性表单。
其中通过在构造函数中添加AddPage()的方法,添加CPropertyPage类的资源:
AddPage(&m_Prop1);
AddPage(&m_Prop2);
AddPage(&m_Prop3);
用SetWizardMode方法可以将属性页式改为向导式
m_sheet.SetWizardMode();
用DoModal方法可以将其显示
DoModal()
由于向导式有“上一步”“下一步”“完成”等类型特殊的按钮。因此需要分别在代表3个属性页的类中为其修改相应的值,以保证在第一页不出现上一步,最后一页以完成告终。
重写OnSetActive()函数,
virtual BOOL OnSetActive( ); //This member function is called by the framework when the page is chosen by the user and becomes the active page.
但上一步下一步等其实是其父类的方法(:CPropertySheet)因此用((CPropertySheet*)GetParent())提取其父类指针,利用其SetWizardButtons(dwFlags)方法来设置。
dwFlags
A set of flags that customize the function and appearance of the wizard buttons. This parameter can be a combination of the following values:
· PSWIZB_BACK Back button
· PSWIZB_NEXT Next button
· PSWIZB_FINISH Finish button
· PSWIZB_DISABLEDFINISH Disabled Finish button
BOOL CProp1::OnSetActive()
{
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
BOOL CProp2::OnSetActive()
{
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
BOOL CProp3::OnSetActive()
{
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_FINISH);
return CPropertyPage::OnSetActive();
}
每个属性表单的响应/检查,是通过LRESULT CProp1::OnWizardNext()来检查的[在该类的重写
LRESULT CProp1::OnWizardNext()
{
// TODO: 在此添加专用代码和/或调用基类
UpdateData(); //获取控件值
if(m_occupation==-1)
{
MessageBox("请选择职业!");
return -1;
}
if(m_workAddr=="")
{
MessageBox("请选择工作地点!");
return -1;
}
return CPropertyPage::OnWizardNext();
}
2、 为ListBox,ComboBox添加项
在相关类的OnInitDialog()方法中添加
((CListBox*)GetDlgItem(IDC_LIST1))->AddString ("北京");
((CListBox*)GetDlgItem(IDC_LIST1))->AddString ("上海");
((CListBox*)GetDlgItem(IDC_LIST1))->AddString ("广州");
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("1000元以下");
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("1000-2000元");
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("2000-3000元");
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("3000元以上");
3、 利用打开属性表单的按钮,去调用Invalidate(); //引起窗体的重绘,这样会自动去调用OnDraw()
void CPropView::OnClick()
{
// TODO: 在此添加命令处理程序代码
//CPropSheet sheet("属性页测试");
m_sheet.SetWizardMode(); //将属性页式改为向导式
if(ID_WIZFINISH==m_sheet.DoModal ())
{
m_iOccupation=m_sheet.m_Prop1.m_occupation ;
m_workAddr=m_sheet.m_Prop1.m_workAddr ;
m_bLike[0]=m_sheet.m_Prop2.m_football ;
m_bLike[1]=m_sheet.m_Prop2.m_basketball ;
m_bLike[2]=m_sheet.m_Prop2.m_volleyball ;
m_bLike[3]=m_sheet.m_Prop2.m_swim ;
m_strSalary=m_sheet.m_Prop3.m_strSalary ;
Invalidate(); //引起窗体的重绘,这样会自动去调用OnDraw()
}
}
4、 OnDraw();输出到文档类的在其间完成。
void CPropView::OnDraw(CDC* pDC)
{
CPropDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
if(m_sheet.m_Prop3.m_isFinish==true)
{
CFont font;
font.CreatePointFont(160,"宋体");
CFont* pOldFont;
pOldFont=pDC->SelectObject(&font);
CString strTemp;
strTemp="您的职业:";
switch(m_iOccupation)
{
case 0:
strTemp+="程序员";
break;
case 1:
strTemp+="系统工程师";
break;
case 2:
strTemp+="系统分析师";
break;
default:
break;
}
pDC->TextOut(0,0,strTemp);
strTemp="您的工作地点是:";
strTemp+=m_workAddr;
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
posted on 2008-07-18 20:11 volnet(可以叫我大V) 阅读(1348) 评论(0) 编辑 收藏 举报