当前位置:C++技术网 > 资讯 > MFC属性单和向导程序开发使用入门详细讲解

MFC属性单和向导程序开发使用入门详细讲解

更新时间:2015-06-26 23:33:56浏览次数:1+次

    程序实现效果图预览:

属性模式

向导模式1

向导模式2 

    在Windows程序Win32编程中,要实现多标签页属性单和向导,非常麻烦。以前工作项目需要,因为那时对MFC并不熟悉,就自己用Win32的基本Tab Control实现了属性表单。当然也工作的很好,但是实现过程就麻烦多了。但是因为MFC不熟,虽然MFC简化了编程,但是,学习MFC的这个属性表单和向导,也不是件轻松的事情。但是,如果一旦掌握了,使用起来就非常方便了。下面我详细一步步讲解这个实现过程。
先了解一下背景知识。
    属性页和向导页(Page),其实是同一个东西。这是属性表单(Sheet)的两种模式,调用表单的成员函数SerWizardMode()就可以设置为向导模式。默认的是属性模式。属性模式就是常说的Tab标签页的样子,单击不同的标签页按钮,切换到不同的页面。而向导模式则是引导用户一步步操作,如软件安装的向导,上一步下一步之类的引导流程,直到最后完成。效果图见最开始的效果图预览,左边为属性模式,右边为向导模式。
    而属性页或者向导页就是一个东西,只是在不同的模式里,称呼不同罢了。下面把属性页和向导页都称为属性页。属性页由CPropertyPage作为基类,使用时要自己从CPropertyPage类派生出一个子类,而不是直接使用这个基类。你要问为什么,就想想使用对话框窗口对象时为什么要自己从CDialog基类中派生一个窗口类,道理是一样的。
    而属性表单,就是用来装属性页的窗口容器。CPropertyPage实际上就是一个对话框窗口对象,如果不添加到表单中,那么就是一个一个的对话框。当然,既然是要添加到属性表单中,那么属性页的窗口风格必须是子窗口,这样才能嵌入到属性表单中。至于窗口是否要边框,都可以。自己可以试试效果。属性表单由CPropertySheet类提供支持,使用时也是要从此类派生一个子类使用,方便定制(嘿嘿,属性页为什么要派生,道理与此相同)。
    而需要谈到的一点,就是属性页的大小和属性表单的大小的问题。属性页作为属性表单的内嵌窗口,多个属性页都放在一个属性表单中的,因此,最大的属性页的大小影响了属性表单的大小。而属性页在属性表单中,属性页中的控件的大小和布局,会和属性页成比例的变化。也就是说,属性页的内容都会被显示在属性表单中,但是资源视图中的属性页的大小可能比实际显示的属性表单大,那么此时,会按照比例将属性表单缩小,属性页中的控件的布局不变,大小按比例缩小。至于修改属性表单的大小,只要把每一个属性页都调大,属性表单也就变大了,但不是属性页调多大属性表单就多大,而是按照一定的比例变大,具体的比例需要查阅相关的说明。
    了解了背景知识,下面来说说如何将属性页添加到属性表单中。
    我们先来创建一个MFC的工程项目。要创建一个需要的MFC项目。创建什么类型的项目如基于对话框、单文档和多文档类型项目,都可以。这里不多说,一张图说明一下。
 创建MFC项目
     先添加两个属性页类,如CmyPage1和CmyPage2,使用添加类向导完成,选择的基类就是CPropertyPage,如下图:
 添加CPropertyPage
     然后添加一个属性表单类,如CmySheet,基类为CPropertySheet。如下图:
 添加CPropertySheet
     然后,将属性页对象作为属性表单的成员对象,要添加几个属性页就放几个成员对象。我们可以添加一个函数,用于初始化属性表单,将属性页添加到属性表单中,我内联了一个函数InitWizardSheet()来处理。函数只有一个参数,表明是否要初始化为向导模式。如果是则设置向导模式,调用函数SetWizardMode();,否则就是属性模式,属性模式则设置一下属性单的标题。此时需要先将m_psh.dwFlag设置PSH_PROPTITLE标志,表示可以设置标题。而PSH_NOAPPLYNOW标志则是去掉“应用”按钮。这里需要说明一点,属性模式中,属性表单有标题,而向导模式中,窗口标题是属性页的标题。
    然后就是设置每一页属性页的标题,也要设置m_psp.dwFalg标志,使用PSP_USETITLE表示可以设置标题。当然,这里的设置标志是m_psp,这是属性页的结构体,而前面说的属性表单的标题设置是属性表单的结构体,不一样,请看清楚。
设置好相关信息后,正式添加属性页到属性表单中了。使用函数AddPage(属性页对象的地址),即可。这样就添加成功了。默认是先加入的先显示,显示的页面叫做活动页。当然你可以调用SetActivePage(基于0的属性页序号),来设置显示的页面。
     初始化属性表单的函数代码如下:
    void InitWizardSheet(BOOL bIsWizad=TRUE)
    {
        if (!bIsWizad)
        {
            SetWizardMode();
        }
        else
        {
            m_psh.dwFlags |= PSH_PROPTITLE | PSH_NOAPPLYNOW;
            m_psh.pszCaption=_T("属性单框架标题");
        }
        m_page1.m_psp.dwFlags |= PSP_USETITLE;
        m_page2.m_psp.dwFlags |= PSP_USETITLE;
        m_page1.m_psp.pszTitle = _T("第一页");
        m_page2.m_psp.pszTitle = _T("第二页");
        AddPage(&m_page1);
        AddPage(&m_page2);
        SetActivePage(1);    
    }

     属性表单和属性页都处理好后,在需要使用的地方,创建一个属性表单的对象,先执行属性表单的初始化函数,就是上面说的函数,然后再调用DoModal()即可显示属性表单了。如果想直接使用属性表单,那么可以将属性表单的初始化函数放在属性表单的构造函数中,这些可以自行安排。

    而在属性页中,就和对话框编程一样的,可以在上面放置各种控件。后面会附上项目源代码,仅供学习参考。其他进一步的使用,请参考其他文章。

    项目源代码下载:MFC属性单和向导程序开发入门详解