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

来源:互联网 发布:战锤全面战争优化差 编辑:程序博客网 时间:2024/05/19 13:24

1、  属性页和表单

一.建属性页和表单

⑴.             新建Single Document应用程序,插入三个IDD_PROPPAGE_LARGE属性页资源,ID分别为IDD_PROP123Caption分别为:Page123

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

选项

普通对话框

属性对话框

Style

Popup

Child

Border

Dialog Frame

Thin

System menu

选中(是系统菜单)

未选中(不是系统菜单)

Disable

未选(可用)

选中(不可用)

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

1

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

⑷.             为创建一个属性表单,先创建一个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();

}             23做响应处理。

二.建属性页和表单

⑴、处理第一个页面:

        将程序员设为Group

,者三个是一组(遇到下一个Group的为止),为IDC_RADIO1关联一个int(此处可以输入)的成员变量m_occupation于是,当选中第1个程序员时,m_occupation的值就是0,依次12当点击下一步的时候判断选中了什么职业。给第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_workAddrOnWizardNext函数:

LRESULT CProp1::OnWizardNext()

{

     if (m_workAddr == "")

     {

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

         return -1;

     }

}

⑵、处理第二个页面

IDC_CHECK1234添加4BOOL型的变量m_footballm_basketballm_volleyballm_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_iOccupationCString型的m_strWorkAddrm_strSalaryBOOL型的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);

}

原创粉丝点击