MFC: 孙鑫教程8笔记

这节课讲了属性表单和向导的创建

一。属性表单创建

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 }
View Code

 

你可能感兴趣的:(mfc)