zoukankan      html  css  js  c++  java
  • VS2010/MFC编程入门之十四(对话框:向导对话框的创建及显示)

    原文地址:http://www.jizhuomi.com/software/166.html

    上一讲鸡啄米讲了属性页对话框和相关的两个类CPropertyPage类和CPropertySheet类,对使用属性页对话框做准备。本节将为大家演示如何创建向导对话框。

           仍然以前面的“加法计算器”的例子为基础,在其中加入向导对话框,我们可以用它来说明加法计算器的使用方法,一步一步引导用户操作,这也是比较常见的用法。

           加法计算器使用时大概可以分为三步:输入被加数、输入加数、点“计算”按钮。

           鸡啄米就详细说明向导对话框的创建步骤:

           1.创建属性页对话框资源

           根据创建对话框模板和修改对话框属性中所讲方法,在“Resource View”的Dialog”节点上点右键,然后在右键菜单中选择“Insert Dialog”创建第一个对话框模板,对话框的ID属性设置为IDD_SUMMAND_PAGE,Caption属性改为“被加数页”,Style属性在下拉列表中选择“Child”,Border属性在下拉列表中选择“Thin”。

           删除“OK”和“Cancel”按钮,再按照为对话框添加控件中所讲方法,添加一个静态文本框,并修改静态文本框的Caption属性为“请先输入double型被加数”。

           按照上述步骤,继续添加第二个和第三个对话框资源。第二个对话框模板的ID设为IDD_ADDEND_PAGE,Caption属性改为“加数页”,也添加一个静态文本框,Caption设为“请继续输入double型加数”,其他属性同第一个对话框。第三个对话框模板的ID设为IDD_ADD_PAGE,Caption属性改为“计算页”,添加静态文本框的Caption属性改为“最后请按下“计算”按钮”,其他属性也第一个对话框一样。

           2.创建属性页类

           按照创建对话框类和添加控件变量中的方法,在第一个对话框模板上点右键,在右键菜单中选择“Add Class”,弹出类向导对话框,在“Class name”编辑框中输入类名“CSummandPage”,与之前不同的是,因为属性页类都应继承于CPropertyPage类,所以要修改下面“Base class”的选项,在下拉列表中选择“CPropertyPage”。

           因为是第一个属性页,所以它应该有一个“下一步”按钮,在哪里添加呢?上一讲CPropertyPage类的可重载函数中提到,OnSetActive函数用于处理属性页被切换为当前活动页的消息,所以我们可以在OnSetActive函数中进行相关设置。

           那怎样重载OnSetActive函数呢?我们可以在“Class View”中找到“CSummandPage”节点,点右键弹出右键菜单,选择“Properties”,然后VS2010右侧面板上会显示对话框的属性列表,属性列表的工具栏上有个tip信息为“Overrides”的按钮,按下它,下方列表中就列出了重载函数,找到“OnSetActive”,点其右侧空白列表项出现向下箭头,再点箭头就在下面出现了“<Add>OnSetActive”的选项,选择它就会自动在CSummandPage类中添加函数OnSetActive。

     

           我们只需在OnSetActive函数体中添加相关代码就可以实现添加“下一步”按钮的效果了。新的函数体如下:

    C++代码
    1. BOOL CSummandPage::OnSetActive()   
    2. {   
    3.     // TODO: Add your specialized code here and/or call the base class   
    4.   
    5.     // 获得父窗口,即属性表CPropertySheet类   
    6.     CPropertySheet* psheet = (CPropertySheet*) GetParent();   
    7.     // 设置属性表只有“下一步”按钮   
    8.     psheet->SetWizardButtons(PSWIZB_NEXT);   
    9.   
    10.     return CPropertyPage::OnSetActive();   
    11. }  

           为第二个和第三个对话框也分别添加属性页类CAddendPage和CAddPage。但第二个对话框的属性页不需要重载OnSetActive函数。第三个对话框是最后一个对话框,所以不需要“下一步”按钮,而应该换成“完成”按钮,所以也需要重载OnSetActive函数设置“完成”按钮。重载后的OnSetActive如下:

    C++代码
    1. BOOL CAddPage::OnSetActive()   
    2. {   
    3.     // TODO: Add your specialized code here and/or call the base class   
    4.   
    5.     // 获得父窗口,即属性表CPropertySheet类   
    6.     CPropertySheet* psheet = (CPropertySheet*) GetParent();   
    7.     //设置属性表只有“完成”按钮   
    8.     psheet->SetFinishText(_T("完成"));   
    9.   
    10.     return CPropertyPage::OnSetActive();   
    11. }  

           上面的代码段中,字符串“完成”前加了个_T,这是因为本工程创建的时候用的默认的Unicode字符集,而如果“完成”前不加_T就是ASCII字符串。_T实际上是一个宏,工程的字符集选择为Unicode时字符串就转为Unicode字符串,选择为Muli-Byte时就转为ASCII字符串。我们可以在Solution Explorer的Addition根节点上点右键,在右键菜单上选择“Properties”,弹出工程的属性对话框,Configuration Properties->General右侧列表中的Character Set就显示选择的字符集。

           那点了第三个属性页上的“完成”按钮我们想进行某些处理的话,就重载OnWizardFinish函数,方法同OnSetActive函数。重载后的OnWizardFinish函数如下:

    C++代码
    1. BOOL CAddPage::OnWizardFinish()   
    2. {   
    3.     // TODO: Add your specialized code here and/or call the base class   
    4.   
    5.     // 提示向导完成   
    6.     MessageBox(_T("使用说明向导已阅读完!"));   
    7.   
    8.     return CPropertyPage::OnWizardFinish();   
    9. }  

            3.创建属性表类

           属性页资源和属性页类创建完以后,还不能生成向导对话框,我们还需要一个属性表类,来容纳这些属性页。

           在Solution Explorer视图中的根节点“Addition”上点右键,在右键菜单中选择Add->Class,弹出“Add Class”对话框,然后在中间区域中选择“MFC Class”,点“Add”按钮,弹出另一个类向导对话框,设置Class name为CAddSheet,Base class选择“CPropertySheet”,点“Finish”按钮,这样就属性表类就建好了。

           接下来,在新生成的AddSheet.h中包含三个属性页类的头文件:

           #include "SummandPage.h"        #include "AddendPage.h"        #include "AddPage.h"

           之后在AddSheet.h中添加private变量:

           CSummandPage    m_summandPage;        CAddendPage     m_addendPage;        CAddPage        m_addPage;

           然后在AddSheet.cpp文件中修改CAddSheet的两个构造函数为:

    C++代码
    1. CAddSheet::CAddSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)   
    2.     :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)   
    3. {   
    4.     // 添加三个属性页到属性表   
    5.     AddPage(&m_summandPage);   
    6.     AddPage(&m_addendPage);   
    7.     AddPage(&m_addPage);   
    8. }   
    9.   
    10. CAddSheet::CAddSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)   
    11.     :CPropertySheet(pszCaption, pParentWnd, iSelectPage)   
    12. {   
    13.     // 添加三个属性页到属性表   
    14.     AddPage(&m_summandPage);   
    15.     AddPage(&m_addendPage);   
    16.     AddPage(&m_addPage);   
    17. }  

            4.显示向导对话框

            我们在加法计算器对话框上添加一个按钮,点击它就打开向导对话框。此按钮的ID设为IDC_INSTRUCT_BUTTON,Caption属性设为“使用说明”。

            按照为控件添加消息处理函数中所讲方法,为IDC_INSTRUCT_BUTTON按钮在CAdditionDlg类中添加点击消息的处理函数OnBnClickedInstructButton。然后在AdditionDlg.cpp文件中包含CAddSheet的头文件:#include "AddSheet.h"。最后修改OnBnClickedInstructButton函数如下:

    C++代码
    1. void CAdditionDlg::OnBnClickedInstructButton()   
    2. {   
    3.     // TODO: Add your control notification handler code here   
    4.   
    5.     // 创建属性表对象   
    6.     CAddSheet sheet(_T(""));   
    7.     // 设置属性对话框为向导对话框   
    8.     sheet.SetWizardMode();   
    9.     // 打开模态向导对话框   
    10.     sheet.DoModal();   
    11. }  

           到此,向导对话框就完整的创建完成了,并可以在加法计算器对话框上点“使用说明”按钮显示出来。我们来看看效果吧:

           上图只是被加数页的效果,点其上“下一步”按钮就可以继续显示后面的两个页面。

           是不是向导对话框没有以前想象的那般复杂了?大家可以发挥想象,进行更复杂的修改,实现更完善的功能。依然欢迎朋友们到鸡啄米博客来交流学习。

  • 相关阅读:
    UVA 1025 A Spy in the Metro DP水题
    ZOJ 3814 Sawtooth Puzzle BFS
    ZOJ 3816 Generalized Palindromic Number
    UVA 10859 Placing Lampposts 树形DP
    UVA 11825 Hackers' Crackdown 状压DP
    POJ 2887 Big String 线段树 离线处理
    POJ 1635 Subway tree systems Hash法判断有根树是否同构
    BZOJ 3110 k大数查询 & 树套树
    sdoi 2009 & 状态压缩
    来自于2016.2.24的flag
  • 原文地址:https://www.cnblogs.com/CocoWang/p/3889477.html
Copyright © 2011-2022 走看看