一、MFC向导页的创建是基于两个基类:CPropertyPage(属性页类)、CPropertySheet(属性组类)。
向导中的每一页的对话框是继承于属性页类,而对所有对话框的管理是继承于属性组类。属性页类的创建是在对话框创建时新建类的继承选择属性页类。
而对于属性组类则是在属性页类创建完成以后在解决方案里面新建MFC类的时候继承属性组类。
属性页中对话框的属性中:Style属性在下拉列表中选择“Child”,Border属性在下拉列表中选择“Thin”。(具体原理还不懂)。然后删除确认和取消按钮(用不到)。
在第一个属性页中,应该有一个“下一步”按钮,在哪里添加呢?上一讲CPropertyPage类的可重载函数中提到,OnSetActive函数用于处理属性页被切换为当前活动页的消息,所以我们可以在OnSetActive函数中进行相关设置。
那怎样重载OnSetActive函数呢?我们可以在“Class View”中找到“CSummandPage”节点,点右键弹出右键菜单,选择“Properties”,然后VS2010右侧面板上会显示对话框的属性列表,属性列表的工具栏上有个tip信息为“Overrides”的按钮,按下它,下方列表中就列出了重载函数,找到“OnSetActive”,点其右侧空白列表项出现向下箭头,再点箭头就在下面出现了“<Add>OnSetActive”的选项,选择它就会自动在CSummandPage类中添加函数OnSetActive。
我们只需在OnSetActive函数体中添加相关代码就可以实现添加“下一步”按钮的效果了。新的函数体如下:
- BOOL CSummandPage::OnSetActive()
- {
- // TODO: Add your specialized code here and/or call the base class
- // 获得父窗口,即属性表CPropertySheet类
- CPropertySheet* psheet = (CPropertySheet*) GetParent();
- // 设置属性表只有“下一步”按钮
- psheet->SetWizardButtons(PSWIZB_NEXT);
- return CPropertyPage::OnSetActive();
- }
如上为重载OnSetActive()函数的步骤,
- CPropertySheet* psheet = (CPropertySheet*) GetParent();
- // 设置属性表只有“下一步”按钮
-
-
-
-
- psheet->SetWizardButtons(PSWIZB_NEXT);
这两句为添加向导框中下一步按钮的函数调用。在最后一个向导框中需要使用完成按钮,则调用如下语句:
psheet->SetFinishText(_T("完成"));
其中还可以重载OnWizardFinish函数,用于响应点击完成按钮后的操作。
二、属性组类
在对属性页操作完成以后,需要建立一个属性组类。来对所有的属性页进行处理。方式如下:
在Solution Explorer视图中的根节点“Addition”上点右键,在右键菜单中选择Add->Class,弹出“Add Class”对话框,然后在中间区域中选择“MFC Class”,点“Add”按钮,弹出另一个类向导对话框,设置Class name为CAddSheet,Base class选择“CPropertySheet”,点“Finish”按钮,这样就属性表类就建好了。
创建完属性组类后include属性页类的头文件,然后新建属性页对象。并在构造函数中将属性页添加到属性表中。属性表中有两个构造函数(原因不明),都需要添加如下语句:
- // 添加三个属性页到属性表
- AddPage(&m_summandPage); //m_summandPage为属性页对象
- AddPage(&m_addendPage);
- AddPage(&m_addPage);
如上操作完成以后,就需要一个函数来响应创建向导。于是可以新建一个按钮函数,在函数中添加响应的语句,如下:
- // 创建属性表对象
- CAddSheet sheet(_T(""));
- // 设置属性对话框为向导对话框
- sheet.SetWizardMode();
- // 打开模态向导对话框
- sheet.DoModal();
运行结果如下图:
总结一波:1、在论坛中有网友提到属性页的顺序不对,基本原因是在属性表中构造函数中添加的顺序不对,一定要按照正常的弹出顺序添加。2、属性页中添加下一步按钮时只需要在第一个属性页的OnsetActive函数中添加即可,剩下的就会都有下一步。即使没有重载OnsetActive函数。3、加油。么么哒。-----------------------------------------------------------------end--------------------------------------------------------
-
如上如果不加:
- // 设置属性对话框为向导对话框
- sheet.SetWizardMode();
这条语句的话,结果显示为: -
-
-
向导的显示形式而已。
-
//---------------------------------------------------------------------------------------end------------------------------------------------------------