天天看点

MFC向导页面(wizard page)

在使用各种软件产品时我们学会碰到点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 &= ~PSP_HASHELP;

m_pUserInfo->m_psp.dwFlags &= ~PSP_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();

}

CPropertyPage类提供了一些消息处理函数,来响应属性页对话框的各种消息。我们重载这些消息处理函数,就可以自定义对属性页对话框操作的处理。可重载的消息处理函

   数包括:

       OnApply:处理属性页的“Apply”按钮被单击的消息

       OnCancel:处理属性页的“Cancel”按钮被单击的消息

       OnKillActive:处理属性页当前活动状态被切换的消息,常用于数据验证

       OnOK:处理属性页的“OK”按钮、“Apply”按钮或者“Close”按钮被单击的消息

       OnQueryCancel:处理属性页的“Cancel”按钮被单击前发出的消息

       OnReset:处理属性页的“Reset”按钮被单击的消息

       OnSetActive:处理属性页被切换为当前活动页的消息

       OnWizardBack:处理属性页的“Back”按钮被单击的消息,仅在向导对话框中有效

       OnWizardFinish:处理属性页的“Finish”按钮被单击的消息,仅在向导对话框中有效

       OnWizardNext:处理属性页的“Next”按钮被单击的消息,仅在向导对话框中有效