属性页对话框

1、分类

  标签式和向导式

2、相关类

  CPropertyPage -属性页,其实就是一个对话框页面,父类是CDialog类

  CPropertySheet -属性表单,父类是CWnd类

  一个完整的属性页对话框由一个属性表单+多个属性页组成

  属性页资源与普通对话框资源的区别:

  属性页:

    

    

  对话框:

    

    

3、标签式属性页

  3.1插入属性页对话框资源,修改语言和字体,双击资源,生成相应的类,注意父类选择CPropertyPage类。

    创建一个单文档视图的MFC工程:Prop

    

    插入3个属性页:

      

      

      

      

      

      

      注意:①这里插入的3个属性页资源的语言均为“English(U.S.)”,须右击资源修改属性为中文语言

          

          

          

         ②3个属性页Page1、Page2、Page3的字体默认均为“MS Sans Serif”,点击“字体[O]...”按键修改字体为中文字体

利用MFC类向导生成相应的属性页类:

          

          

          

          

  3.2类视图下右击工程,选择添加新的类,父类是CPropertySheet类。

    

    

  3.3在属性表单中添加属性页对象,在属性表单类的构造函数中调用  CPropertySheet::AddPage

    首先在在属性表单对象CPropSheet的头文件PropSheet.h中分别把先前创建的三个属性页的头文件包含进来:

      #include "Prop1.h"

      #include "Prop2.h"

      #include "Prop3.h"

    然后在属性表单对象CPropSheet的头文件PropSheet.h中为三个属性页分别定义成员变量:

      public:

      CProp1 m_prop1;

      CProp2 m_prop2;

      CProp3 m_prop3;

    属性表单类有两个构造函数,在构造属性表单对象时,可任选其一构造函数,调用AddPage函数添加属性页对象:      

CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
    :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
    AddPage(&m_prop1);
    AddPage(&m_prop2);
    AddPage(&m_prop3);
}

CPropSheet::CPropSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
    :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
    AddPage(&m_prop1);
    AddPage(&m_prop2);
    AddPage(&m_prop3);
}

  3.4创建显示属性表单  CPropertySheet::Domodal()

    在Prop程序的主菜单上添加一个菜单项,用户单击这个菜单项后,程序显示属性表单;

      

    在视图类中添加该菜单项的消息响应函数

      

    在CPropView类的源文件开始部分包含CPropSheet类的头文件:

      #include "stdafx.h"

      #include "Prop.h"

      #include "PropDoc.h"

      #include "PropView.h"

      #include "PropSheet.h"

    在程序新添加的菜单项的响应函数中,调用DoModal函数显示一个模式化的属性表单:      

void CPropView::OnPropertysheet() 
{
    // TODO: Add your command handler code here
    CPropSheet propSheet("属性表单");
    propSheet.DoModal();
    
}

      构造的CPropSheet类型的属性表对象propSheet调用的是以标题为参数的属性表单构造函数;

  3.5当控件的值发生改变时,将应用按钮设置为可用  CPropertyPage::SetModified(TRUE);

  3.6消息处理(通过在页面类中添加虚函数的方式实现)

    CPropertyPage::OnApply

    CPropertyPage::OnOK

    CPropertyPage::OnCancel

4、向导式属性页

  4.1插入属性页对话框资源,修改语言和字体,双击资源,生成相应的类,注意父类选择CPropertyPage类。

  4.2类视图下右击工程,选择添加新的类,父类是CPropertySheet类。

  4.3在表单类中添加属性页对象,在构造函数中调用  CPropertySheet::AddPage

  ---------------------------------之前的步骤与标签式属性页中创建属性表单的实现步骤一致

  4.4创建和显示前,设置为向导模式  CPropertySheet::SetWizardMode    

void CPropView::OnPropertysheet() 
{
    // TODO: Add your command handler code here
    CPropSheet propSheet("属性表单");

    propSheet.SetWizardMode();

    propSheet.DoModal();
    
}

  4.5创建和显示  CPropertySheet::DoModal()

  4.6设置每个页面的向导按钮

    1--在 CPropertyPage::OnSetActive() 函数中设置

    2--在属性页中获取表单对象的指针  GetParent()

    3--设置向导按钮  CPropertySheet::SetWizardButtons()

      void SetWizardButtons( DWORD dwFlags );

      dwFlags:PSWIZB_BACK / PSWIZB_NEXT / PSWIZB_FINISH / PSWIZB_DISABLEDFINISH

    首先在第一个属性页的类CProp1中右击添加虚函数OnSetActive,第一个属性页应该只有【下一步】和【取消】

            

BOOL CProp1::OnSetActive() 
{
    // TODO: Add your specialized code here and/or call the base class
    ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);

    return CPropertyPage::OnSetActive();
}

    为第二个属性页CProp2添加OnSetActive虚函数,第二个属性页应该有【上一步】【下一步】和【取消】      

BOOL CProp2::OnSetActive() 
{
    // TODO: Add your specialized code here and/or call the base class
    ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_NEXT);
    
    return CPropertyPage::OnSetActive();
}

    再为第三个属性页CProp3添加OnSetActive函数,第三个属性页应该有【上一步】和【完成】    

BOOL CProp3::OnSetActive() 
{
    // TODO: Add your specialized code here and/or call the base class
    ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK|PSWIZB_FINISH);
    
    return CPropertyPage::OnSetActive();
}

    在资源窗口的第一个属性页资源上,为单选按钮组关联一个成员变量

      注意:单选按钮组的第一个单选按钮的属性中的“组”要勾选,以标识这几个单选按钮为一组,只能选择其一;

        

      利用MFC类向导添加成员变量:

        

      默认会在CProp1类的构造函数中将m_occupation变量初始化为-1

        

      在选中单选按钮组的第一个单选按钮时,关联的成员变量m_occupation的值变为0;选中第二个单选按钮变为1;选中第三个单选按钮变为2;

      为CProp1类添加OnWizardNext虚函数,完成对属性页上【下一步】按钮的命令响应:

               

LRESULT CProp1::OnWizardNext() 
{
    // TODO: Add your specialized code here and/or call the base class
    //须调用UpdateData函数以调用DoDataExchange来完成控件与成员变量的数据交换
    UpdateData(TRUE);  
    
    if(m_occupation==-1){
        MessageBox("请选择你的职业");
        return -1;
    }
    
    return CPropertyPage::OnWizardNext();
}

    要在属性页显示前向列表框中添加显示内容,为CProp1类添加WM_INITDIALOG消息的响应函数OnInitDialog;列表框控件有个相应的MFC类:CListBox,利用其成员函数AddString可向列表框添加字符:      

BOOL CProp1::OnInitDialog() 
{
    CPropertyPage::OnInitDialog();
    
    // TODO: Add extra initialization here
    ((CListBox*)GetDlgItem(IDC_LIST1))->AddString("北京");
    ((CListBox*)GetDlgItem(IDC_LIST1))->AddString("上海");
    ((CListBox*)GetDlgItem(IDC_LIST1))->AddString("广州");
    ((CListBox*)GetDlgItem(IDC_LIST1))->AddString("深圳");

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

      利用MFC类向导给列表框控件关联一个成员变量m_workAddr:

        

                

LRESULT CProp1::OnWizardNext() 
{
    // TODO: Add your specialized code here and/or call the base class
    //调用UpdateData函数以调用DoDataExchange来完成控件与成员变量的数据交换
    UpdateData(TRUE);  
    
    if(m_occupation==-1){
        MessageBox("请选择你的职业");
        return -1;
    }

    if(m_workAddr==""){
        MessageBox("请选择你的工作地点");
        return -1;
    }
    
    return CPropertyPage::OnWizardNext();
}

      在资源窗口的第二个属性页资源上,为四个复选框分别关联成员变量

        

        程序自动将复选框控件关联的各个成员变量初始化,当复选框控件被选中时,所关联的成员变量的值为TRUE,否则为FALSE;

        

        为CProp2类添加OnWizardNext虚函数,以在点击【下一步】时检查用户是否点选复选框

                

LRESULT CProp2::OnWizardNext() 
{
    // TODO: Add your specialized code here and/or call the base class
    UpdateData(TRUE);
    if(m_football || m_basketball || m_volleyball || m_swim){
        return CPropertyPage::OnWizardNext();
    }else{
        MessageBox("请选择你的兴趣爱好");
        return -1;
    }
    
}

      为第三个属性页的CProp3类添加WM_INITDIALOG消息的响应函数OnInitDialog;组合框对应的MFC类为CComboBox,利用该类的成员函数AddString向组合框控件的列表框中添加选项;

                

BOOL CProp3::OnInitDialog() 
{
    CPropertyPage::OnInitDialog();
    
    // TODO: Add extra initialization here
    ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("10000元以下");
    ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("10000-20000元");
    ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("20000-30000元");
    ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("30000元以上");
    
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

        要是组合框的下拉选项的顺序和添加的顺序一样,须勾选掉资源窗口中组合框资源的属性中样式里的“分类”:

        

        要使得组合框中在显示时有一个默认的选中项,须使用SetCurSel函数实现:

          int SetCurSel(int nSelect);

          参数为选项的位置索引;如果为-1,则将移除组合框的当前选项并清空编辑框中的内容;        

BOOL CProp3::OnInitDialog() 
{
    CPropertyPage::OnInitDialog();
    
    // TODO: Add extra initialization here
    ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("10000元以下");
    ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("10000-20000元");
    ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("20000-30000元");
    ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("30000元以上");

    ((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0);
    
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

        为第三个属性页CProp3类添加成员变量:CString m_strSalary,用来接收用户的选择;给CProp3类添加虚函数:OnWizardFinish,用来处理【完成】按钮的单击消息;

          

          

          为了获取用户在第三个属性页CProp3中的组合框的选择项,须先利用GetCurSel函数获得组合框中当前选项的位置,再利用GetLBText函数获得组合框的相应位置的对应字符串;          

BOOL CProp3::OnWizardFinish() 
{
    // TODO: Add your specialized code here and/or call the base class
    int index;
    index=((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel();
    ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText(index,m_strSalary);
    
    return CPropertyPage::OnWizardFinish();
}

          为了接收用户在向导类属性列表的各个属性页中的选择,在程序的视图类中须定义相应的成员变量来保存;

          

          

          

          

          然后在视图类的构造函数中初始化这些成员变量:          

CPropView::CPropView()
{
    // TODO: add construction code here
    m_iOccupation=-1;
    m_strWorkAddr="";
    memset(m_bLike,0,sizeof(m_bLike));  //对数组m_bLike进行快速初始化
    m_strSalary="";
}

          判断只有当用户点击的是【完成】按钮,程序才接收各个属性页中的选择项:          

void CPropView::OnPropertysheet() 
{
    // TODO: Add your command handler code here
    CPropSheet propSheet("属性表单");

    propSheet.SetWizardMode();

    if(ID_WIZFINISH==propSheet.DoModal()){
        m_iOccupation=propSheet.m_prop1.m_occupation;
        m_strWorkAddr=propSheet.m_prop1.m_workAddr;
        m_bLike[0]=propSheet.m_prop2.m_football;
        m_bLike[1]=propSheet.m_prop2.m_basketball;
        m_bLike[2]=propSheet.m_prop2.m_volleyball;
        m_bLike[3]=propSheet.m_prop2.m_swim;
        m_strSalary=propSheet.m_prop3.m_strSalary;
        Invalidate();
    }   
}

  4.7消息处理函数

    虚函数:

    OnSetActive()--当属性页被选中时,使其成为当前的活动页面

    OnCancel()--单击属性页的【取消】按钮时程序调用该虚函数

    OnWizardNext()--单击属性页上【下一步】按钮时程序调用该虚函数;如果返回0,则自动进入当前向导的下一个属性页;如果返回-1,属性页不发生变化;

    OnWizardBack()--单击属性页【上一步】按钮时程序调用该虚函数

    OnWizardFinish()--单击属性页【完成】按钮时程序调用该虚函数

时间: 2024-10-11 06:58:22

属性页对话框的相关文章

(转载)VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)

前面讲了模态对话框和非模态对话框,本节开始鸡啄米讲一种特殊的对话框--属性页对话框.另外,本套教程所讲大部分对VC++各个版本均可适用或者稍作修改即可,但考虑到终究还是基于VS2010版本的,所以将<VC++/MFC编程入门>改为<VS2010/MFC编程入门>. 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过标签切换各个页面.另外,我们在创建MFC工程时使用的向导对话框也属于属性页对话框,它通过点击"Next&

(转载)VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)

属性页对话框包括向导对话框和一般属性页对话框两类,上一节鸡啄米讲了如何创建并显示向导对话框,本节将继续介绍一般属性页对话框的创建和显示. 实际上,一般属性页对话框的创建和显示过程和向导对话框是很类似的.鸡啄米将上一节中的向导对话框进行少量修改,使其成为一般属性页对话框. 一般属性页对话框的创建步骤: 1.创建属性页对话框资源 属性页对话框资源的创建方法同向导对话框是一样的,上一讲中的对话框资源不需进行任何修改. 2.创建属性页类 属性页类的创建和向导对话框的属性页类也基本一样,只是一般属性页对话

MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)

属性页对话框包括向导对话框和一般属性页对话框两类,上一节讲了如何创建并显示向导对话框,本节将继续介绍一般属性页对话框的创建和显示. 实际上,一般属性页对话框的创建和显示过程和向导对话框是很类似的.将上一节中的向导对话框进行少量修改,使其成为一般属性页对话框. 一般属性页对话框的创建步骤: 1.创建属性页对话框资源 属性页对话框资源的创建方法同向导对话框是一样的,上一讲中的对话框资源不需要进行任何修改. 2.创建属性页类 属性页类的创建和向导对话框的属性页类也基本一样,只是一般属性页对话框中不需要

C++MFC编程笔记day10 MF界面控件的使用2、属性页对话框、MFC线程

一 树型控件 1 相关类 CTreeCtrl-父类是CWnd,控件类. CTreeView-父类是CCtrlView,视图类.CTreeView=CView+CTreeCtrl CTreeView::GetTreeCtrl 2 CTreeCtrl的使用 对比CListCtrl:列表控件的每个数据项之间是平等关系,通过数据项 的索引值得到数据项的信息.树控件每个数据项称之为节点.节点之间 的关系包括父子关系和兄弟关系.通常通过节点句柄得到某个节点. 通常用来表示层次关系的数据. 2.1 设置控件的

属性页对话框 去掉下面的一排按钮

属性页的模式有2种 <span style="font-size:18px;"></span><pre name="code" class="cpp"> //向导模式 ID_WIZNEXT // Next ID_WIZBACK // Back ID_WIZFINISH // Finsh IDCANCEL // Cancel //普通模式 IDOK // OK IDCANCEL //Cancel ID_APPLY

MFC属性页对话框

属性页对话框 分类 标签式和向导式 相关类 CPropertyPage-父类是CDialog类,称为属性页或页面对话框. CPropertySheet-父类是CWnd,称为属性表单. 一个完整的属性页对话框由一个属性表单+多个属性页组成.属性页嵌套在属性表单内. 标签式属性页的创建步骤: 1 插入属性页对话框资源,选中对话框资源ID修改语言为Chinese(P.R.C), 选中资源视图的右边的对话框右键选择属性设置为宋体,9号字体,双击资源,生成相应的类,注意父类选择CPropertyPage类

VS2010/MFC对话框:一般属性页对话框的创建及显示

一般属性页对话框的创建及显示 本节将介绍一般属性页对话框的创建和显示. 实际上,一般属性页对话框的创建和显示过程和向导对话框是很类似的.鸡啄米将上一节中的向导对话框进行少量修改,使其成为一般属性页对话框. 一般属性页对话框的创建步骤: 1.创建属性页对话框资源 属性页对话框资源的创建方法同向导对话框是一样的,上一讲中的对话框资源不需进行任何修改. 2.创建属性页类 属性页类的创建和向导对话框的属性页类也基本一样,只是一般属性页对话框中不需要“下一步”和“完成”等按钮,所以上一讲中属性页类的OnS

VS2010-MFC(对话框:属性页对话框及相关类的介绍)

转自:http://www.jizhuomi.com/software/164.html 一 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过标签切换各个页面.另外,我们在创建MFC工程时使用的向导对话框也属于属性页对话框,它通过点击"Next"等按钮来切换页面. 属性页对话框就是包含一般属性页对话框和向导对话框两类.它将多个对话框集成于一身,通过标签或按钮来切换页面. 二 属性页对话框相关类       我们使用属性页对话框时

带属性页的对话框

以带2个属性页的对话框为例 (VS2008) 1. 在资源试图 添加三个 对话框.修改三个对话框的ID名字为合适的名字. 2. 修改两个属性页对话框的属性.  Style -- Child;  Border -- None . 3. 给三个对话框添加三个类.  都是CDialog的子类.  右击点击资源--> 添加类 即可. 4. 给基础对话框(我们这里表示用来包含属性页的哪个对话框)添加一个Tab Control 控件, 并且给Tab Control 添加控件变量m_tab 5. 在对话框的头