vc++学习笔记08---创建属性表单和向导
MFC里面的对控件的操作都是通过对响应的类的操作;
创建属性表单时:
1首先创建实例对象对话框,然后创建该对话框的类,以备于在CPropertySheet中使用;
2创建属性表对象,利用CPropertySheet实例对象,然后在该类中添加实例对象类的成员变量
public: CProp3 m_prop3; CProp2 m_prop2; CProp1 m_prop1;
3,利用AddPage()函数初始化实例对象;
CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(nIDCaption, pParentWnd, iSelectPage) { AddPage(&m_prop1); AddPage(&m_prop2); AddPage(&m_prop3); }
4在窗口响应按钮里面,,利用doModal()模态化;
创建向导
在 Domadol之前调用setWizardMode()就可以创建一个向导;
void CPropView::OnProperty() { CPropSheet PropSheet("属性表单程序"); PropSheet.SetWizardMode();//建立向导;建立向导必须设置属性页的按钮(下一步,完成...)
利用此函数,但是SetwizardButton()该函数必须在OnSetActive()中被调用;可以通过添加虚函数解决
BOOL CProp1::OnSetActive() { CPropSheet*p=(CPropSheet*)GetParent(); p->SetWizardButtons(PSWIZB_NEXT); return CPropertyPage::OnSetActive(); }
然后响应“下一步”消息的函数,捕捉WM_WIZARDNEXT消息
LRESULT CProp1::OnWizardNext() { UpdateData(TRUE);//更新选择的消息,ture,写入,false 写出 if (-1==m_occupation) //m_occupation是单选控件的成员变量,表明其是否被选中,注意该控件的Group要选中,否则classwizard无反应 { MessageBox("选择职业"); return -1; } if (_T("")==m_workAddr)//w——workAddr是combox的成员变量 { MessageBox("请选择工作地点"); return -1; } return CPropertyPage::OnWizardNext(); }
初始化编译控件的响应
BOOL CProp1::OnInitDialog() { CPropertyPage::OnInitDialog(); ((CListBox*)GetDlgItem(IDC_ListBox1))->AddString("北京");//对ListBox添加项,利用Addstring函数 ((CListBox*)GetDlgItem(IDC_ListBox1))->AddString("天津"); ((CListBox*)GetDlgItem(IDC_ListBox1))->AddString("山东"); return TRUE; }
属性页2的响应:添加控件的成员变量,以区别是否被选中;
CProp2::CProp2() : CPropertyPage(CProp2::IDD) { //{{AFX_DATA_INIT(CProp2) m_FootBall = FALSE; m_BasketBall = FALSE; m_ValletBall = FALSE; m_Swimming = FALSE; //}}AFX_DATA_INIT }
响应函数
LRESULT CProp2::OnWizardNext() { UpdateData(TRUE); if (m_BasketBall|m_FootBall|m_Swimming|m_ValletBall) { return CPropertyPage::OnWizardNext(); } else { MessageBox("请选择爱好!"); return -1; } }
属性页3
对combolist的控件添加信息,捕捉WM_INITDIALOG消息
BOOL CProp3::OnInitDialog() { CPropertyPage::OnInitDialog(); ((CComboBox*)GetDlgItem(IDC_COMBO3))->AddString("1000-2000"); ((CComboBox*)GetDlgItem(IDC_COMBO3))->AddString("2000-3000"); ((CComboBox*)GetDlgItem(IDC_COMBO3))->AddString("3000-5000"); ((CComboBox*)GetDlgItem(IDC_COMBO3))->AddString("5000-8000"); ((CComboBox*)GetDlgItem(IDC_COMBO3))->AddString("10000以上"); ((CComboBox*)GetDlgItem(IDC_COMBO3))->SetCurSel(0); return TRUE; }响应“完成”的函数
BOOL CProp3::OnWizardFinish() { int index; //定义一个索引,保存控件combolist选择的条目 index=((CComboBox*)GetDlgItem(IDC_COMBO3))->GetCurSel();//利用GetCurSel(0保存索引; ((CComboBox*)GetDlgItem(IDC_COMBO3))->GetLBText(index,m_strSalary);//利用GetLBText()获得当前索引条目的内容 return CPropertyPage::OnWizardFinish(); }
==================================================================================================================================
将客户选择好的信息保存
void CPropView::OnProperty() { CPropSheet PropSheet("属性表单程序"); PropSheet.SetWizardMode(); if (ID_WIZFINISH==PropSheet.DoModal()) { m_iOccupition=PropSheet.m_prop1.m_occupation; m_strAddr=PropSheet.m_prop1.m_workAddr; m_strSalary=PropSheet.m_prop3.m_strSalary; m_strLike[0]= PropSheet.m_prop2.m_FootBall; m_strLike[1]=PropSheet.m_prop2.m_BasketBall; m_strLike[2]=PropSheet.m_prop2.m_ValletBall; m_strLike[3]=PropSheet.m_prop2.m_Swimming; Invalidate();//引起当前重画 } }将客户选择的信息输出到界面上:
void CPropView::OnDraw(CDC* pDC) { CPropDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CFont font; font.CreatePointFont(300,"华文行楷");//创建字体 CFont *poldFont; poldFont=pDC->SelectObject(&font); CString strtmp;//缓存变量 strtmp="你的职业: "; switch (m_iOccupition) { case 0: strtmp+="程序员"; break; case 1: strtmp+="系统工程师"; break; case 2: strtmp+="ITLeader"; break; default: break; } pDC->TextOut(0,0,strtmp); strtmp="你的工作地点: "; strtmp+=m_strAddr; TEXTMETRIC tm;//获得字体高度,以用于显示 pDC->GetTextMetrics(&tm); pDC->TextOut(0,tm.tmHeight,strtmp); strtmp="你的兴趣爱好: "; if (m_strLike[0]) { strtmp+="足球"; } if (m_strLike[1]) { strtmp+="篮球"; } if (m_strLike[2]) { strtmp+="排球"; } if (m_strLike[3]) { strtmp+="游泳"; } pDC->TextOut(0,tm.tmHeight*2,strtmp); strtmp="你的薪资水平: "; strtmp+=m_strSalary; pDC->TextOut(0,tm.tmHeight*3,strtmp); pDC->SelectObject(poldFont); }
Edit By SolarJupiter