vc wizard 1

 实现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();  
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值