其实实现向导的创建,跟实现属性页的创建是一样的步骤的,只不过它是在属性表单对象的DoModal函数之前,调用SetWizardMode 函数。
void CMy20080808View::OnPropertysheet()
{
// TODO: Add your command handler code here
PropSheet.SetWizardMode();
CPropSheet propSheet("属性表单");
propSheet.DoModal ();
}
这样就实现了向导的基本框架了;
在属性页的OnSetActice 函数中调用SetWizardButtons 这个函数,当属性页被选中,从而成为一个活动的页面时,应用程序框架就会调用OnSetActive这个函数;OnSetActive函数是一个虚函数,因此,应该在属性页子类中重写这个函数,然后根据该属性页设置按钮;
设置按钮通过CPropertySheet 函数提供的SetWinzardButtons 成员函数,来实现;
如何实现属性表单对象,属性表单是属性页的父窗口,所以可以通过GetParent函数来获取属性页的父窗口的指针,即属性表单的指针;
GetParent 函数返回的是CWnd类型的指针,所以我们需要通过强制转换,将CWnd类型的指针转换为CPropertySheet类型的指针;
代码:
BOOL CProp1::OnSetActive()
{
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
其中void SetWizardButtons( DWORD dwFlags );
Parameters
dwFlags
A set of flags that customize the function and appearance of the wizard buttons. This parameter can be a combination of the following values:
- PSWIZB_BACK Back button 设置上一步
- PSWIZB_NEXT Next button 设置下一步
- PSWIZB_FINISH Finish button 设置完成
- PSWIZB_DISABLEDFINISH Disabled Finish button 设置禁用的完成按钮
向导上面的具体实现:
如果完成了第一页的操作,当点击“下一步”时,程序会调用OnWizardNext这个虚函数,如果这个函数返回0,那么程序将自动进入当前向导的下一个属性页,如果返回-1,将禁止属性页发生变更。
控件与成员变量的数据交换是通过DoDataExchange 函数来完成的,而程序中并不直接调用这个函数,而是通过调用UpdateData 函数来调用他,对于UpdateData函数,当它的参数为TRUE 时,是从控件得到成员变量的值;当参数值为FALSE时,是用成员变量的值来初始化控件。,这个参数的默认值为TRUE。
在MFC编程中,对控件的操作都是通过相关的MFC类来完成的。
一般情况下,CPropertySheet类的DoModal函数的返回值是IDOK或IDCANCEL,但是如果属性表单已经被创建为向导了,那么该函数的返回值将是ID_WIZFINISH 或IDCANCEL。