您的位置:首页 > 其它

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

2012-03-21 14:30 459 查看
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: