实现wizard 的NEXT按钮在一开始时是灰的,当属性页上的某些编辑控件有内容后才使能NEXT按钮
class CMyPropertyPage1 : public CPropertyPage
{
...
public:
BOOL OnSetActive();//重载
...
}
//实现文件
#include "MyPropertySheet.h"
...
BOOL CMyPropertyPage1::OnSetActive()
{
//得到Sheet
CMyPropertySheet *pParent = (CMyPropertySheet *)GetParent();
//得到Next钮
CWnd *pWnd = pParent->GetDlgItem(ID_WIZNEXT);
//此处直接灰掉
pWnd->EnableWindow(false);
//一定要调用基类实现
return CPropertyPage::OnSetActive();
}
然后在各个分页发送相关消息使NEXT可用
=======================================================================
用MFC的CPropertySheet可以实现wizard。方法是
用CPropertySheet:SetWizardMode()。最简单的wizard
用VC中预装的property sheet component就可以了。
所有的属性页都预先加好,然后通过Back,Next button
在各页之间浏览。但如果要实现有分支情况的wizard,
这样就不行了。比如第二页是根据第一页的某个输入
值来确定的。这就需要动态地添加属性页。
基本的思想是这样的:
1 在每个Property Page中加入一个成员变量m_NextPage;
2 在每页的OnWizardNext()中根据当前已经获得的输入值,
确定下一页,然后用CPropertySheet:AddPage()来添加
该页,并记录在m_NextPage中。
3 在每页的OnSetActive()中检查是否有添加的下一页,如
有,就用CPropertySheet:RemovePage()删除该页。之所
以在OnSetActive()中删除添加的页,而不是在添加的页
的自己的OnWizardBack()中删除,是因为RemovePage会
改变CPropertySheet的属性页列表的激活顺序,导致无法
正常返回到上一页。
下面是有关代码:
第一页:
BOOL CMyPropertyPage1::OnSetActive()
{
CMyPropertySheet * pParent = (CMyPropertySheet *)GetParent();
ASSERT_KINDOF(CMyPropertySheet, pParent); //获得Property sheet
pParent->SetWizardButtons(PSWIZB_NEXT); //只显示NEXT Button
// 如果是从下页返回的,必定有NextPage,删除之,
// 以便根据具体输入值重新添加下页
if (m_NextPage != NULL) {
pParent->RemovePage(m_NextPage);
m_NextPage = NULL; //不要忘记恢复NULL
}
return CPropertyPage::OnSetActive();
}
LRESULT CMyPropertyPage1::OnWizardNext()
{
CMyPropertySheet * pParent = (CMyPropertySheet *)GetParent();
ASSERT_KINDOF(CMyPropertySheet, pParent);
// 根据具体值,决定添加页,这里简单添加一页
pParent->AddPage(m_NextPage = &pParent->m_Page3);
return CPropertyPage::OnWizardNext();
}
其它的页类似,中间的页只要Override OnSetActive() and OnWizardNext()
最后一页Override OnSetActive(),改变一下按纽的显示就可以了。
=========================================================
//1、在新的一页的onsetactive中调用getdlgitem(id)->setfocus()
// 2、在每个页面的构造函数中添加:m_psp.dwFlags &= ~PSP_HASHELP;
=========================================================
使用CPropertyPage建立setup程序,如何从第一个页面直接进入底三个页面?还能够返回的
CPropertySheet* psheet = (CPropertySheet*) GetParent();
psheet->SetActivePage(2);//进入第三个页面
BOOL CDlgPage3::OnSetActive()//第三个页面有返回按钮
{
CPropertySheet* psheet = (CPropertySheet*) GetParent();
psheet->SetWizardButtons(PSWIZB_BACK);
return CPropertyPage::OnSetActive();
}