效果,从菜单上可以弹出对话框,在对话框中可选择内容,最后在文档文件中显示所选择的内容(孙鑫教程的第8章)。
1、新建单文档应用程序
2、从资源中添加Dialog对话框,这种对话框,并对添加的属性框进行页面内容设计
3、分别对添加的3个对话框添加相应的类。基类为
4、添加属性表单类PropertySheet,并将3个对话框对象加入到这个属性表单中
首先在这个类中增加3个成员变量对应三个窗口,并在这个类中include这三个类
然后在属性表单的构造函数中去增加这三个属性页对象
最后在菜单中添加一列用来显示属性表单,为为其在VIEW类加添加函数
在函数中构建一个对象,并调用DoModel函数。
到此为止,已经可以成功调用属性页窗口了。
接下来是进一步完善过程:
1、向导的创建
在调用DoModel之间调用SetWizardMode()就可以创建一个向导
2、设置按钮
在第一个属性表单中设置只能点击下一点,在第一个属性页类CProp1中添加虚函数OnSetActive();
由于属性页包含在属性表单中,所以属性表单是属性页的父窗口。我们想要改变这个向导按钮,在属性页中要调用属性表单窗口(向导在属性表单中而又要在第一个属性页中单独设置所以才在第一个属性页中设置)
3、判断用户的选择,选择后才能进入下一个页面
首先为每个控件增加相应的变量
注意:单选按钮是一组的.直到遇到下一个具有Group类型的按钮,否则之前的都是一组,排序从0开始,当为-1时表示用户没有选中。
在选择下一步时判断用户是否选中,记得用UpdateData()将数据更新到变量。
下拉列表操作:
int index;
index = ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel();
((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText(index,m_salary);
4、将用户的选择显示出来
1、首先在VIEW类中设置变量用来存储用户的选择,并在构造函数中给它们赋初值
private:
int m_iOccupation;
CString m_strWorkAddr;
BOOL m_bLike[4];
CString m_strSalary;
2、当用户选择“确定“时显示用户选择,选择"取消"时,放弃选择,条件如下:
(ID_WIZFINISH==propSheet.DoModal())
3、将用户选择赋值给变量
m_iOccupation = propSheet.m_prop1.m_occupation;
m_strWorkAddr = propSheet.m_prop1.m_workaddr;
m_bLike[0] = propSheet.m_prop2.m_footbal;
m_bLike[1] = propSheet.m_prop2.m_basketball;
m_bLike[2] = propSheet.m_prop2.m_vollyball;
m_bLike[3] = propSheet.m_prop2.m_swim;
m_strSalary = propSheet.m_prop3.m_salary;
Invalidate();让窗口无效
4、重绘窗口,显示用户选择
注:在列表框中增加可选项:
在对话框将要显示之前,发送内容给列表框,在每一个属性页中添加初始化函数
在MFC当中,对控件的操作都是通过相关的类来完成的。
F,未完待续
总结:
过程:属性页创建完成之后,分别实例化了三个属性页对象,又创建了属性表单,在属性表单的构造函数种用AddPage()函数将属性页增加到属性表单当中,最后就是属性表单的显示。
问题:属性页不能单独显示吗?为什么要创建属性表单,是为了让三个属性页一起显示吗?如果只有 一个属性页还用创建属性表单吗
注:
1、CProSheet::DoModal创建模态的属性表单,CPropertySheet::创建非模态的属性表单
2、数组元素的快速初始化memset(m_bLike,0,sizeof(m_bLike));