📄 08.2.2 创建属性表单.txt
字号:
8.2.2 创建属性表单
为了创建一个属性表单,首先需要创建一个 CPropertySheet对象,接下来,在此对象中为每一个属性页创建一个对象(CPropertyPage类型),并调用AddPage函数添加每一个属性页,然后调用DoModal函数显示一个模态属性表单,或者调用Create函数创建一个非模态属性表单。
因此,可以通过以下几个步骤实现属性表单创建的功能:
由需要为Prop程序创建一个属性表单对象。选择VC++开发环境窗口上的【Insert\ New Class..】菜单命令,将弹出添加新类对话框,在此对话框中,将新类命名为: CPropSheet,并选择其基类为CPropertySheet,结果如图8.42所示。
一一图 8.42添加的属性表单类
在属性表单对象 (CPropSheet)中添加属性页。这需要调用 CPropertySheet类的成员函数: AddPage,其声明原型如下所示 :
void AddPage( CPropertypage *pPage );
可以看到,这个函数有一个 CPropertyPage类型指针的参数,它指向的就是需要添加到属性表单中的属性页对象。也就是说,通过这个函数,可以将属性页对象添加到属性表单中。
我们首先在属性表单对象 (CPropSheet )的头文件中为先前创建的三个属性页分别定义一个成员对象,代码如下所示 :
CPropl ID-propl;
CProp2 ID-prop2;
CProp3 ID-prop3;
通常都是在属性表单对象的构造函数中添加属性页对象。但是对 CPropSheet对象来说,此时它还不知道 CPropl、 CProp2和 CProp3这三种类型的定义,所以还必须在 CPropSheet类的头文件中分别把这三个属性页类的头文件包含进来,代码如下所示:
#include "Propl.h"
#include .Prop2.h"
#include "Prop3.h"
接下来,我们就可以在 CPropSheet类的构造函数中添加这三个属性页对象,但是发现这个类有两个构造函数,代码如例 8-3所示。
例 8-3
CPropSheet : : CPropSheet(U工NT nIDCaption, CWnd* pParentWnd, U工 NT工 SelectPage) :CPropertySheet(nIDCaption, pParentWnd,工 SelectPage)
CPropSheet : :CPropSheet (LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
其中一个函数是用 ID号( nIDCaption ) ,另一个函数是用标题字符串( pszCaption )来
构造属性表单对象。而对应的基类: CPropertySheet的两个构造函数的声明原型如下所示 :
CPropertySheet ( U工NT n1以:aption, CWnd *pParent阶ld = NULL , UINT iSelectPage = 0 ) ; CPropertySheet( LPCTSTR pszCaption, Cwnd *pParentWnd = NULL , U工 NT iSelectPage = 0 );
可以看到,这两个构造函数的后两个参数都是相同的,并且第二个参数 pParentW时,即父窗口指针都有默认值: NULL,此时属性表单的父窗口就是应用程序的主窗口。对于 SDI应用程序来说,就是应用程序的主框架窗口。第三个参数 iSelectPage指定的是属性表
单初始选择的属性页,我们可以通过这个参数,来指定属性表单初始显示时显示的属性页,默认是第一个页面。
因为属性表单类有两个构造函数,在构造属性表单对象时,读者可以任选其中一个构
造函数。这里我们在这两个构造函数都调用AddPage函数添加属性页对象,代码如下所示:
AddPage(&m-propl) ;
AddPage(&m-prop2) ;
AddPage(&m-prop3) ;
③显示属性表单。 CPropertySheet类的继承层次结构如图 8.43所示,我们可以看到这个 CPropertySheet类是从CWnd类派生而来的,而不是派生于CDialog类。但是, CPropertySheet对象
图8.43 CPrope句Sheet类的继承层次结构和CDialog对象的操纵方式是类似的。例如,属性表单对象的创建也需要两个步骤,第一步调用构造函数定义一个属性表单对象,然后调用DoModal成员函数创建一个模态属性表单,或者调用Create成员函数创建一个非模态属性表单。
知道了属性表单的创建步骤,下面我们就据此在Prop程序中创建井显示 CPropertySheet对象。首先在该工程的主菜单上添加一个菜单项,当用户单击这个菜单项
后,程序显示CPropertySheet属性表单对象。为了简单起见,就在Prop程序主菜单的【帮
助】子菜单后面添加一个菜单项,并在其属性对话框中取消Pop-up选工页,将其Caption属
性设置为:属性表单, ID属性设置为: IDM_PROPERTYSHEET,结果如图8.44所示。
图 8.44新添菜单项的属性对话框
然后利用 ClassWizard为这个新菜单项添加命令响应函数。本例让CPropView类捕在此菜单命令,井接受系统自动赋予的响应函数名称: OnPropertysheet。然后,在此函数中添加创建属性表单的代码,结果代码如例8-4所示。
例8-4
void CProp飞liew: :OnPropertysheet()
// TODO : Add your command handler code here
CPropSheet propSheet("肩性表单);
) ;
propSheet.DoModal();
上述例8-4所示代码中,首先构造了一个CPropSheet类型的属性表单对象:propSheet,
这里调用的是以标题为参数的属性表单构造函数,并且因为该构造函数的后两个参数都有默认值,所以调用时没有为它们提供参数值。然后,调用该属性表单对象的 DoModal函数,, 显示一个模态属性表单。当然,别忘了在 CPropView类中包含 CPropSheet类的头文件,即在 C PropView类的源文件开始部分添加例 8-5所示代码中加灰显示的那行语句。
成员函数来显示一个模态属性表羊。
Build并运行 Prop程序,单击【属性表单】菜单项,即可弹出如图 8.45所示的属性表单。 |应性表单川丁'主j F吨.1 Ihce2 11'吨.3 I
从图 8.45可以看到,这个属性表单有一些问题,属性页上的中文显示的是乱码。这主要是因为在插入属性页资源时,它默认的语言是英语。因此,必须将属性页资源的语言属性修改为中文,方法是在 ResourceView选项卡上,在 IDD_PROPl资源 t单击鼠标右键,从弹出的快捷菜单中选择【 Properties】菜单命令,即可显示如图 8.46所示的对话框属性对话框,将该属性页的语言选项修改为 : Chinese ( P.R.C.)。按照同样的方法将 IDD PROP2 和 IDD PROP3属性页资源的语言都改为中文。
然后还需要修改属性页对话框的字体。方法是在 ResourceView选项卡上,双击 IDD PROPl标识项,这将打开 Pagel属性页资源,在此资源上单击鼠标右键,从弹出的快捷菜单中选择【Properties】菜单命令,将显示该属性页的属性对话框,单击该对话框上的【Font】按钮,即可出现如图8.47所示的选择对话框字体的对话框,从字体的下拉列表中选择:宋体,从而将Pagel属性页资源的字体修改为"宋体"。利用同样的方法将Page2和Page3属性页资源的字体也修改为"宋体"。
图 8.47对话框字体设置对话框
再次运行Prop程序,单击【属性表单】菜单项,将弹出如图8.48所示的属性表单,分别单击Page2和 Page3选项页,可以得到如图 8.49和图 8.50所示的属性页,可以看到中文的显示正常了。如果之前在创建属性页资源时,我们选择的是插入普通对话框资源,就不会出现这种问题。但是这时也需要修改普通对话框资源的一些属性(具体属性参见前面的内容),使其符合属性页资源的要求。可见这两种创建属性页资源的方法各有利弊,读者可以根据自己的习惯选择其中的一种方法。
图 8.50属性表单的第三个属性页
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -