在使用各种软件产品时我们学会碰到点next的那种页面,像安装程序啊,或者注册之类的场景中最常见.我们一般把这样的页面叫向导页面.
下面我们来瞧瞧是咋实现的.创建向导页面最关键的就是两个类的使用CPropertySheet与CPropertyPage.你可以这样简单的来理解,CPropertySheet像一个文件夹子,里面装着一页页的文件(CPropertyPage).
下面来创建只有两个页面的注册向导.
1.创建继承自CPropertyPage的两个类
CUserNotice 和 CUserInfo;
2.创建继承自CPropertySheet的类
CWizardPages.
///////////CWizardPages.h//////////////////////
public:
CWizardPages(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
virtual ~CWizardPages();
private:
CUserNotice* m_pUserNotice;
CUserInfo* m_pUserInfo;
////////////////CWizardPages.cpp////////////////////////////////////////////
CWizardPages::CWizardPages(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
m_pUserNotice = new CUserNotice();
m_pUserInfo = new CUserInfo();
this->m_psh.dwFlags &= ~PSH_HASHELP; //去掉Help按钮
m_pUserNotice->m_psp.dwFlags &= ~PSH_HASHELP;
m_pUserInfo->m_psp.dwFlags &= ~PSH_HASHELP;
AddPage(m_pUserNotice);
AddPage(m_pUserInfo);
SetActivePage(iSelectPage); //打开向导时默认显示的页面.
SetWizardMode(); //指定为向导页面,不这样指定默认把所有页面放一起变成tab标签形式的了.
}
CWizardPages::~CWizardPages(){
if(m_pUserInfo)
delete m_pUserInfo;
if(m_pUserNotice)
delete m_pUserNotice;
}
假如在其他哪个地方点个注册按钮,回调函数中敲入如下代码
CWizardPages wizard(_T("Register Wizard Page"),this,0);
wizard.DoModal();
我们一般希望第一个页面中的back按钮不可点,最后一个页面有finish按钮.
我们可以在OnSetActive()这个函数中做相关设置(该函数是CPropertyPage中的一个虚函数).当显示哪个页面时,该页面对应的OnSetActive函数被调用.
假如CUserNotice是第一个页面
BOOL CUserNotice::OnSetActive(){
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT|PSWIZB_CANCEL); //只有next与cancel按钮可用
return CPropertyPage::OnSetActive();
}
CUserInfo为最后一个页面
BOOL CUserInfo::OnSetActive(){
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_FINISH|PSWIZB_BACK|PSWIZB_CANCEL); //有finish按钮
return CPropertyPage::OnSetActive();
}