向导模式对话框的创建和显示

我们在“一般类型属性页”的基础上,再介绍另一种属性页类型,即向导类型属性页。


一个向导类型的属性页对话框,每次只有一个属性页是可见的。该类型的属性页对话框没有OK和Apply Now按钮,代替它们的是一个Back按钮,一个Next或Finish按钮和一个Cancel按钮,创建这种类型的属性页和创建一般类型属性页的所需要的过程是一样的,这总里结和向导类型相关的知识。


设置类型


在调用属性表单对象的DoModal之前,我们应该先调用SetWizardMode函数,此成员函数用来建立一个作为向导的属性页,其函数声明如下:

void SetWizardMode();
说明:

在该模式下DoModal返回ID_WIZFINISH或IDCANCEL,设置完该模式后,属性页就变成了如图1的默认形式,


                                    图1  默认的属性页外观


外观定制


每个属性页都有“上一步”和“下一步”,为了符合正常的逻辑,我们需要通过属性页的外观,这几个按钮都是由框架生成的,我们可以通过CPropertySheet::SetWizardButtons函数完成按钮外观定制。其函数声明如下:

void SetWizardButtons( DWORD dwFlags );

参数: dwFlags 参数可以是下列值的组合: 

· PSWIZB_BACK                         Back按钮。
· PSWIZB_NEXT                          Next按钮。
· PSWIZB_FINISH                        Finish按钮。
· PSWIZB_DISABLEDFINISH    Disabled Finish按钮。

通常来说,应该在CPropertyPage::OnSetActive函数调用SetWizardButtons函数,OnSetActive函数是个虚函数,因此我们在每个属性页类中需要重写这个函数,其函数声明如下:

virtual BOOL OnSetActive();
说明:
当用户选择了此页并将其变为活动页时,框架调用这个成员函数。重载此成员函数来执行当一个页被激活时要执行的任务。

有时候我们需要判断下用户在当前是否有输入,如果没有输入需要给出提示,CPropertyPage类提供了三个虚函数完成相关操作提示,其函数声明如下:

virtual LRESULT OnWizardBack();
virtual BOOL OnWizardFinish();
virtual LRESULT OnWizardNext();
返回值:
如果正常则返回0;如果禁止页改变,则返回-1。
重载这些成员函数来指定当按钮被按下时用户必须做的某些动作。


处理第一页


我们的第一个属性页是如图2所示,它是有一个组框和三个Radio按钮组合而成的,我们需要将第一个控件的Group属性改为True,并绑定一个变量记录用户的按钮选择


                                     图2  第一个属性页


外观定制具体代码如下:

BOOL COccupationPage::OnSetActive()
{
    // TODO: 在此添加专用代码和/或调用基类
    //
    ((CPropertySheetDlg*)GetParent())->SetWizardButtons(PSWIZB_NEXT);//第一个属性页只有下一步

    return CPropertyPage::OnSetActive();
}

用户信息输入检测代码如下:

/****************************************************************
*函数名称:OnWizardNext
*功    能:按下“下一步”时的信息检测
*作    者:Jin
*日    期:2016年11月7日
****************************************************************/
LRESULT COccupationPage::OnWizardNext()
{
    // TODO: 在此添加专用代码和/或调用基类
    //获取数据
    UpdateData(TRUE);
    if (-1 == m_nOccuption)//m_nOccuption是成员变量的,默认值是-1
    {
        MessageBox("请选择职位");
        return-1;
    }

    return CPropertyPage::OnWizardNext();
}


处理第二页


我们的第二个属性页是如图3所示,提供“完成”和“上一步”按钮,属性页由静态文本控件和组合框列表控件组成。


                                      图3  第二个属性页


第二个属性页的外观设置和信息保存代码如下:

BOOL CSallaryPage::OnSetActive()
{
    // TODO: 在此添加专用代码和/或调用基类
    //最后一个属性页包含上一步和完成按钮
    ((CPropertySheetDlg*)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_FINISH);

    return CPropertyPage::OnSetActive();
}

BOOL CSallaryPage::OnWizardFinish()
{
    // TODO: 在此添加专用代码和/或调用基类
    //获取组合框被选中的字符数组的下标
    int nSelIndex = m_ComboxSallary.GetCurSel();
    //获取被选中的字符串
    m_ComboxSallary.GetLBText(nSelIndex, m_strSallary);

    return CPropertyPage::OnWizardFinish();
}

输出用户配置


当用户完成相关信息选择后,我们可以利用MessageBox完成信息输入输出,具体实现代码如下:

void CProperty1Dlg::OnBnClickedCreateProperty()
{
    // TODO: 在此添加控件通知处理程序代码
    CPropertySheetDlg PropertySheet("属性页表单");

    PropertySheet.SetWizardMode();//向导模式
    CString strJobInfo = "";

    if (PropertySheet.DoModal() == ID_WIZFINISH)
    {
        CString strJobInfo = "你的职位: ";
        int index =  PropertySheet.m_WorkPage.m_nOccuption;
        switch (index)
        {
        case 0:
            strJobInfo +="软件工程师
";
        	break;
        case 1:
            strJobInfo +="软件经理
";
            break;
        case 2:
            strJobInfo +="项目经理
";
            break;
        default:
            ;
        }

        CString strtemp("你的工资: ");
        strtemp    += PropertySheet.m_SallayPage.m_strSallary;
        strJobInfo  += strtemp;

        //用户输入信息显示
        MessageBox(strJobInfo, "JobInfo");
    }

}

运行结果:



总结:

一个属性表由一个CPropertySheet对象和一个或多个CPropertyPage对象构成。属性表由框架来显示,其创建需要分两步进行:先调用构造函数,然后对模式属性表调用DoModal,或对非模式属性表调用Create。

若要创建一个向导类型的对话框,其步骤与创建一个标准的属性表的步骤是一样的,但是要在调用DoModal之前,必须先调用SetWizardMode函数。为了定制属性表的功能和外观,需要调用SetWizardButtons函数。

原文地址:https://www.cnblogs.com/jinxiang1224/p/8468363.html