这节课讲了属性表单和向导的创建
一。属性表单创建
1. 资源列表里添加一些PROPPAGELARGE的DIALOG
2. 对这些dialog进行编辑
3. 为这些DIALOG增加类,基类是CPropertyPage
4. 创建一个新的类,基类是CPropertySheet,该类就是属性表单的实例
5. 在这个属性表单类里增加上面dialog类的成员变量们(注意包含相关的头文件),在两个构造函数里AddPage上面这些DIALOG类
AddPage(&m_prop1);
AddPage(&m_prop2);
AddPage(&m_prop3);
6. 在MENU里增加属性表单选项,增加对应的消息响应函数,在VIEW里
7. CPropSheet propSheet("标题");
propSheet.DoModal();
注意增加"PropSheet.h"的头文件
二。向导创建
在上面的DoModal()之前增加propSheet.SetWizardMode();
这里还是有不少问题,比如在最后一页没有完成,第一页还有上一步等等
这里是在各个属性页的class里增加虚函数CProp1::OnSetActive
在里面增加((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
在CProp2::OnSetActive里增加((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT | PSWIZB_BACK);
在CProp3::OnSetActive里增加((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
三。向导里要求必须填写内容后才能下一步
1. 为里面的组框里选上group选项,并增加对应的成员变量int m_occupation
2. 将CProp1构造函数里初始化列表的m_occupation设为-1
3. 在CProp1里增加虚函数OnWizardNext里面增加:
UpdateData();
if (m_occupation == -1) {
MessageBox("请选择你的职业!");
return -1;
}
四。在列表框里增加选项
1. 在CProp1里增加虚函数OnInitDialog()
2. 在函数里增加:((CListBox*)GetDlgItem(IDC_LIST1))->AddString("beijing");
五。在组合框里增加选项
1. 在CProp3里增加OnInitDialog()
2. 在函数里增加:((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("below 1000");
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("1000-2000");
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("2000-3000");
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("3000 up");
如果要按上面这个顺序,需要在资源列表里将组合框的sorted选项设成FALSE
如果要在初始的时候就选中某一项,则增加:
((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0);
这里0是第一个选项
六。将选项输出到view中
1. 在CProp3里增加CString成员变量m_strSalary
2. 在CProp3里增加虚函数OnWizardFinish()
3. 在该函数里增加
int index = ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel();
((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText(index, m_strSalary);
4. 在view里增加成员变量int m_iOccupation;
CString m_strWorkAddr;
BOOL m_bLike[4];
CString m_strSalary;
在构造函数中初始化
m_iOccupation初始化为-1
memset(m_bLike, 0, sizeof(m_bLike));
5. 在view里的OnPropertysheet()函数里将propSheet.DoModal();改为
if (ID_WIZFINISH == propSheet.DoModal()) {
m_iOccupation = propSheet.m_prop1.m_occupation;
m_strWorkAddr = propSheet.m_prop1.m_wordAddr;
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_swimming;
m_strSalary = propSheet.m_prop3.m_strSalary;
Invalidate();
}
6. 在view里的OnDraw函数里增加:
CString strTemp;
对strTemp进行赋值,并输出
1 void CPropView::OnDraw(CDC* pDC) 2 { 3 CPropDoc* pDoc = GetDocument(); 4 ASSERT_VALID(pDoc); 5 if (!pDoc) 6 return; 7 8 // TODO: 在此处为本机数据添加绘制代码 9 CString strTemp; 10 strTemp = "你的职业:"; 11 switch (m_iOccupation) { 12 case 0: 13 strTemp += "程序员"; 14 break; 15 case 1: 16 strTemp += "运动员"; 17 break; 18 case 2: 19 strTemp += "银行职员"; 20 break; 21 default: 22 break; 23 } 24 pDC->TextOut(0, 0, strTemp); 25 strTemp = "你的工作地点:"; 26 strTemp += m_strWorkAddr; 27 TEXTMETRIC tm; 28 pDC->GetTextMetrics(&tm); 29 30 pDC->TextOut(0, tm.tmHeight, strTemp); 31 32 strTemp = "你的兴趣爱好:"; 33 if (m_bLike[0]) { 34 strTemp += "football "; 35 } 36 if (m_bLike[1]) { 37 strTemp += "basketball "; 38 } 39 if (m_bLike[2]) { 40 strTemp += "volleyball "; 41 } 42 if (m_bLike[3]) { 43 strTemp += "swimming "; 44 } 45 pDC->TextOutA(0, tm.tmHeight*2, strTemp); 46 47 strTemp = "你的薪资水平:"; 48 strTemp += m_strSalary; 49 pDC->TextOutA(0, tm.tmHeight*3, strTemp); 50 }