属性表单就是例如ClassWizard属性表页一样,一个属性表单由一个或者多个属性页组成。提供了对信息分类和组织管理功能。
向导就是,你刚开始建立一个工程时,会有一个接一个属性页引导你做出相应的选择。
现在新建一个MFC AppWizard(exe)工程,看下向导提供的功能,工程名Prop。
1、弹出第一个对话框:选择Single document,同时取消Document/View···选项,将不会为应用程序生成文档类。
2、点击Next,来到了第二个对话框:是否包含对数据库的支持,选择None。
3、点击Next,来到了第三个对话框:是否包含对复合文档的支持。选择None。
4、点击Next,来到了第四个对话框:询问应用程序包含哪些功能,去掉打印和打印预览功能。单击Advance,会出现Doucument Templates String属性页和Windows Style属性页,在该属性页中可以设置是否使用拆分窗口,是否包含最大化、最小化等按钮。
5、点击Next,来到了第五个对话框:询问工程的样式、是否生成源文件注释以及怎样使用MFC类库。若将MFC类库作为DDL库来使用,编辑的文件就比较小,但是将可执行程序移植到其他系统下,由于缺少MFC类库而导致程序不能运行。如果选择静态链接库就不会出现这个问题。
6、点击Next,来到了第六个对话框:此对话框可以设置类的名称以及所在文件的名称。
8.2.1创建属性页
属性页窗口就是一个对话框窗口。
新建一个属性页资源:Insert->resource->Dialog下IDD_PROPPAGE_LARGE->New
以同样的方法,再插入两个属性页资源。同时修改这三个属性页资源的ID和标题:
IDD_PROP1 Page1 IDD_PROP2 Page2 IDD_PROP3 Page3
属性页资源与普通对话框资源的属性的区别:
对话框:Style是Popup,Border是Dialog Frame,System menu选中
属性页:Style是Child,Border是Thin,System menu未选中。
在More Style里面,属性页资源选择了Disable。
知道了这两种资源之间的区别,可以先在程序中增加一个普通对话框资源,然后修改其属性,把它当作属性页资源来用。
继续完成Prop程序属性表单的创建:
第一个属性页:放置一个组框,将组框的标题修改为“请选择你的职业”,然后在这个组框内放置三个单选按钮;在属性页上面再放置一个列表框,在列表框之上放置一个静态文本控件,修改其文本属性为“请选择你的工作地点”。如图。
第二个属性页:添加一个组框,添加四个按钮选项。
第三个属性页:添加一个组合框,组合框尽量将范围拉大,否则无法完全显示下拉框中的内容。Layout->Test可以测试对话框运行时的外观。按ESC键退出。
组合框提供了编辑框加列表框的功能,打开组合框的属性对话框->Style->Type,下有三种类型:
Simple:包含一个编辑框和总是显示的列表框。
Dropdown:组合框仅仅当单击下拉箭头时,列表框才会弹出。
DropList:编辑框是只读的,仅仅只能从下拉列表中选择相应的内容。
选择DropList。
这个时候Drop就有三个属性页对话框资源。针对这三个资源生成属性页类。
View->ClassWizard弹出一个对话框,选择创造一个新类。
弹出添加新类对话框,输入类名CProp1,基类选择CPropertyPage。就添加完成一个新类。
然后单击ClassWizard->Add class->New以同样的方法添加另外的两个新类。
由于VC++自身的问题,添加新类之后,可能无法打开新类的源文件和头文件,为了解决这个问题:
1、保存工程
2、关闭当前工作空间
3、找到该工程的所在的目录,找到.clw文件,删除这个文件。
4、打开刚刚关闭的工作空间,View->ClassWizard就会弹出一个对话框,选择是。然后后面弹出的对话框直接单击OK就行了。
8.2.2创建属性表单
创建一个属性表单,首先创建一个CPropertySheet对象;然后在该对象中为每一个属性页创建一个对象(CPropertyPage类型);调用AddPage函数添加每一个属性页;调用DoModal函数显示一个模态属性表单,或者调用Create函数创建一个非模态属性表单。
1、为Prop程序创建一个属性表单对象:
Insert->New Class,将新类名为CPropSheet,基类为CPropertySheet。
2、CPropSheet类头文件中为先前创建的三个属性页分别定义一个成员对象,鼠标右键单击添加成员变量:
// Implementation
public:
CProp1 m_prop1;
CProp2 m_prop2;
CProp3 m_prop3;
virtual ~CPropSheet();
3、要在该头文件中包含三个属性页的头文件
// PropSheet.h : header file
//
#include "Prop1.h"
#include "Prop2.h"
#include "Prop3.h"
4、在属性页表单对象中添加属性页,利用CPropertySheet类成员函数:AddPage。
void AddPage( CPropertyPage *pPage );
接下来在CPropSheet类的构造函数中添加这三个属性页类的头文件。但是这个类有两个构造函数。
CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
}
CPropSheet::CPropSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
}
两个函数只有第一个参数是不同的。一个是ID号,一个是标题字符串。
可以选择其中的一个,这里在两个构造函数中都调用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);
}
5、显示属性表单。属性表单对象的创建也需要两个步骤:首先调用构造函数定义一个属性表单对象,然后调用DoModal成员函数创建一个模态属性表单或者调用Create函数创建一个非模态属性表单。
在Prop程序主菜单帮助子菜单下添加一个菜单项,取消Pop-up选项,将Caption改为属性表单,ID改为IDM_PROPERTYSHEET。
然后利用视类捕获菜单COMMAND消息,接受自动赋予的响应函数名称:OnPropertysheet。
void CPropView::OnPropertysheet()
{
// TODO: Add your command handler code here
CPropSheet propSheet("属性表单");
propSheet.DoModal();
}
但是要记得添加CPropSheet类的头文件。
#include "stdafx.h"
#include "Prop.h"
#include "PropDoc.h"
#include "PropView.h"
#include "PropSheet.h"
运行程序,发现属性页上面的中文显示是乱码。,因为在插入属性页资源时,默认语言是英语,因此要将属性页的资源改为中文。
IDD_PROP1资源上单击鼠标右键->将属性页的语言修改为中文,同样地对IDD_PROP2,IDD_PROP3进行修改。
然后修改属性页对话框的字体:双击IDD_PROP1,打开Page1属性->Properities->Font,选择宋体。
如果之前在创建属性页资源时,如果插入的是普通对话框资源,就不会出现这种问题。