MFC学习笔记之:属性页和表单的使用

转载 2012年03月21日 14:30:43

1、  属性页和表单

一.建属性页和表单

⑴.             新建Single Document应用程序,插入三个IDD_PROPPAGE_LARGE属性页资源,ID分别为IDD_PROP1,2,3;Caption分别为:Page1,2,3。

属性页对话框和普通添加的对话框资源的区别为:

选项

普通对话框

属性对话框

Style

Popup

Child

Border

Dialog Frame

Thin

System menu

选中(是系统菜单)

未选中(不是系统菜单)

Disable

未选(可用)

选中(不可用)

⑵.             画出3个对话框如下图:

图1

⑶.             有个3个属性页对话框资源,要对这3个资源生成相应的属性页类。在图1上右键Add Class,基类为CPropertyPage,类名为CProp1。同样添加类CProp2和CProp3。

⑷.             为创建一个属性表单,先创建一个CPropertySheet对象,再在此对象中为每一个属性页创建一个CPropertyPage对象,并调用AddPage函数添加每一个属性页,然后DoModal显示模态或Create创建非模态。

⑸.             Add Class,雷鸣为CPropSheet,基类为CPropertySheet;在CPropSheet.h头文件中加

public:

#include "Prop1.h"                             CProp1 m_prop1;

#include "Prop2.h"                             CProp2 m_prop2;

#include "Prop3.h"                             CProp3 m_prop3;

⑹.             在两个构造函数中都加入:

  AddPage(&m_prop1);

  AddPage(&m_prop2);

  AddPage(&m_prop3);

再在菜单栏加“属性表单”按钮,添加点击函数,在函数中:

void CPropView::OnPropertysheet()

{

     CPropSheet propsheet("属性表单");

     //propsheet.SetWizardMode();

     propsheet.DoModal();

}

这样点击就会跳出属性表单了。以上注释去掉就是向导了。

但是第1个中有上一步,应该添加OnSetActive响应,在函数中加入

BOOL CProp1::OnSetActive()

{

     ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);

     return CPropertyPage::OnSetActive();

}             2,3做响应处理。

二.建属性页和表单

⑴、处理第一个页面:

        将程序员设为Group

,者三个是一组(遇到下一个Group的为止),为IDC_RADIO1关联一个int型(此处可以输入)的成员变量m_occupation。于是,当选中第1个程序员时,m_occupation的值就是0,依次1,2。当点击下一步的时候判断选中了什么职业。给第1个页面类添加

OnWizardNext响应,在函数中:

LRESULT CProp1::OnWizardNext()

{

     // TODO: Add your specialized code here and/or call the base class

     UpdateData();

     if (m_occupation = -1)

     {

         MessageBox("请选择你的职业");

         return -1;

     }

     return CPropertyPage::OnWizardNext();

}

向列表框中添加工作地点:为CProp1类添加OnInitDialog消息,在函数中:

BOOL CProp1::OnInitDialog()

{

     ((CListBox*)GetDlgItem(IDC_LIST1))->AddString("市区");

     ((CListBox*)GetDlgItem(IDC_LIST1))->AddString("滨江");

     ((CListBox*)GetDlgItem(IDC_LIST1))->AddString("萧山");

}

为列表框控件关联一个CString类型的变量m_workAddr。OnWizardNext函数:

LRESULT CProp1::OnWizardNext()

{

     if (m_workAddr == "")

     {

         MessageBox("请选择你的工作地点");

         return -1;

     }

}

⑵、处理第二个页面

为IDC_CHECK1,2,3,4添加4个BOOL型的变量m_football,m_basketball,m_volleyball和m_swim。此时在构造函数中毒初始化为FALSE(未选中)。为CProp2添加OnWizardNext响应。

LRESULT CProp2::OnWizardNext()

{

     UpdateData();

     if (m_football || m_basketball || m_volleyball || m_swim)

     {

         return CPropertyPage::OnWizardNext();

     }

     else

     {

         MessageBox("请选择你的兴趣爱好!");

         return -1;

     }

}

⑶、处理第三个页面:

为CProp3类添加OnInitDialog消息响应,在OnInitDialog函数中:

BOOL CProp3::OnInitDialog()

{

     ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("1000元以下");

     ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("1000元-2000元");

     //((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0);

}初始化显示一个去掉以上注释就是了。

三.接受属性页和表单所做的选择

为下拉菜单添加CString类型的成员变量m_strSalary,为CProp3添加虚函数:OnWizardFinish。

BOOL CProp3::OnWizardFinish()

{

     int index = ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel();

     ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText(index,m_strSalary);//将第index个选项中的内容放到m_strSalary中

     return CPropertyPage::OnWizardFinish();

}

将用户做出的选择在视图中显示,要给视图添加成员变量:int型的m_iOccupation;CString型的m_strWorkAddr和m_strSalary;BOOL型的m_bLike[4](注意和上面4个变量的区别)。设为私有。并在构造函数中初始化。

CPropView::CPropView()

{

    m_iOccupation = -1;

     m_strWorkAddr = "";

     m_strSalary = "";

     memset(m_bLike,0,sizeof(m_bLike));//C语言中memset是对m_bLike数组进行快速初始化。都设置为0就是设置为FALSE

}

点击完成的时候将在窗口中选中的内容传到View类的成员变量中。

void CPropView::OnPropertysheet()

{

     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();//窗口重绘,条用Ondraw函数

     }

}

现在调用OnDraw函数:

void CPropView::OnDraw(CDC* pDC)

{

     CFont font;

     font.CreatePointFont(300,"华文行楷");//创建指定字体类型和字体大小

     CFont *pOldFont;

     pOldFont = pDC->SelectObject(&font);

     CString strTemp;

     strTemp = "你的职业:";

     switch (m_iOccupation)

     {

     case 0:

         strTemp+="程序员"; break;

     case 1:

         strTemp+="系统工程师"; break;

     case 2:

         strTemp+="项目经理"; break;

     default: break;

     }

     pDC->TextOut(0,0,strTemp);

     strTemp = "你的工作地点:";

     strTemp+=m_strWorkAddr;

     TEXTMETRIC tm;//TEXTMETRIC存储装置字体结构信息

     pDC->GetTextMetrics(&tm);//GetTextMetrics把程序当前的字体信息,存放到TEXTMETRIC中

     pDC->TextOut(0,tm.tmHeight,strTemp);

     strTemp = "你的兴趣爱好:";

     if (m_bLike[0])

     {

         strTemp+="足球、";

     }

     if (m_bLike[1])

     {

         strTemp+="篮球、";

     }

     if (m_bLike[2])

     {

         strTemp+="排球、";

     }

     if (m_bLike[3])

     {

         strTemp+="游泳";

     }

     pDC->TextOut(0,tm.tmHeight*2,strTemp);

     strTemp = "你的薪资水平:";

     strTemp+=m_strSalary;

     pDC->TextOut(0,tm.tmHeight*3,strTemp);

     pDC->SelectObject(pOldFont);

}

一般属性页对话框创建和显示

点击“计算机/属性/高级系统设置”就可以出现如图1的对话框,这个对话框就是一个属性表单,它的每一个选项卡就是一个属性页。一个属性表单由一个或多个属性页组成。它有效解决了大量信息无法在一个对话框上显示,...
  • xiao3404
  • xiao3404
  • 2016年11月06日 17:55
  • 498

MFC中属性表单,向导,Tab控件演示实例

刚刚学习MFC编程不久,指导师兄交代了几个小任务,现将自己的工作再梳理一面,以加深印象! 达到的目的是这样的,在第一个和第二个页面各输入一个值,再把这两个值求和的结果输入到第三个页面中来。共用三种方法...
  • dby3579
  • dby3579
  • 2015年03月09日 15:25
  • 763

MFC之添加属性页

属性页一定是由几个页面构成的,首先要创建几个基类是CPropertyPage的对话框。例如,创建两个类,CTestPage1 、CTestPage2 一定要有一个类去管理几个属性页面,然后要创建一个基...
  • hhhuang1991
  • hhhuang1991
  • 2015年09月21日 15:42
  • 986

MFC中创建属性页或者向导对话框

要在MFC中创建属性也或者向导对话框需要涉及到两个类:CPropertyPage和CPropertySheet类。 首先需要在MFC工程中打开资源视图,在资源视图中然后在Dialog中右击插入一个对...
  • jameshater
  • jameshater
  • 2016年03月08日 22:19
  • 1076

MFC属性页对话框

属性页对话框  分类   标签式和向导式   相关类  CPropertyPage-父类是CDialog类,称为属性页或页面对话框。  CPropertySheet-父类是CWnd,称为属性表单。  ...
  • eldn__
  • eldn__
  • 2014年08月05日 09:03
  • 13619

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

本文转自鸡啄米:http://www.jizhuomi.com/software/164.html    感 谢鸡啄米对本文的贡献。 前面讲了模态对话框和非模态对话框,本节开始鸡啄米讲一种特殊的对话...
  • my_lord_
  • my_lord_
  • 2016年08月12日 11:37
  • 476

属性表单属性页的使用

效果,从菜单上可以弹出对话框,在对话框中可选择内容,最后在文档文件中显示所选择的内容(孙鑫教程的第8章)。 1、新建单文档应用程序 2、从资源中添加Dialog对话框,这种对话框,并对添加的属性框进行...
  • dyz_123456
  • dyz_123456
  • 2016年10月26日 17:27
  • 383

在对话框中加入属性页的方法

当一个基于对话框的程序中有相当多的控件时,你一定会想到使用属性页来将这些控件分类放置。本文针对这种方法来讨论几种可能实现的方案。 方案一 本方案的例子请见源代码打包文件中的Property...
  • shaopengf
  • shaopengf
  • 2014年06月18日 20:31
  • 1829

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

属性页对话框包括向导对话框和一般属性页对话框两类,上一节讲了如何创建并显示向导对话框,本节将继续介绍一般属性页对话框的创建和显示。        实际上,一般属性页对话框的创建和显示过程和向导对...
  • zhaoyinhui0802
  • zhaoyinhui0802
  • 2016年11月27日 10:42
  • 734

谈一谈属性页和Tab控件

最近给新带的一个小师弟布置了一个小作业:很简单就是有三个Tab页面,每个Tab页面有1个编辑框,在第一个和第二个编辑框界面各输入一个数字,在切换第三个Tab时编辑框内显示前两个Tab页的编辑框输入数字...
  • wenzhou1219
  • wenzhou1219
  • 2014年01月07日 13:27
  • 5736
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC学习笔记之:属性页和表单的使用
举报原因:
原因补充:

(最多只允许输入30个字)