关闭

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

标签: mfclist工作classmenu语言
981人阅读 评论(0) 收藏 举报

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);

}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:686571次
    • 积分:6061
    • 等级:
    • 排名:第4424名
    • 原创:1篇
    • 转载:282篇
    • 译文:0篇
    • 评论:49条
    文章分类