6.6 属性页对话框
属性页对话框将多个对话框集中起来,通过标签或按钮 来激活各个页面。主要分为一般属性页对话框和向导对话框两类。在一般属性页对话框中,页面的切换通过单击不同的标签实现,在向导对话框中,页面的选择是通 过点击“上一页”、“下一页”、“完成”和“取消”等按钮实现的。
与属性页对话框相关的类主要包括 CPropertySheet类和CPropertyPage类。一个属性页可以包含一个CPropertySheet类(或者其派生类)的对象和多个 CPropertyPage类(或者其派生类)的对象。下面我们详细地来介绍这两个类的概念。
6.6.1 CPropertySheet类
CPropertySheet类是CWnd类的一个 派生类。CProportySheet类的对象作为属性页对话框的窗口框架出现,主要实现管理各个属性页面的作用。
虽然CPropertySheet类不是 CDialog类的派生类,但是在使用该类时却和CDialog类非常相似:首先运行CPropertySheet类的构造函数,然后调用DoModal 函数实现一个模态属性页对话框,或者调用Creat函数实现一个非模态属性页对话框,CPropertySheet类的构造函数有两个。即 CPropertySheet::Construct函数和CPropertySheet::CPropertySheet函数。在属性页对话框中进行数 据交换和在普通对话框中进行数据交换类似,只是成员变量通常作为CPropertyPage类或其派生类的成员变量。
CPropertysheet类的主要成员如下。
— m_psh
说明:m_psh是PROPSHEETHEADER 结构类型的数据成员,主要定义属性页的框架和关于页面的信息。
— CPropertySheet
其原型为:
CPropertySheet( );
CPropertySheet( UINT nIDCaption, CWnd *pParentWnd = NULL, UINT iSelectPage = 0 );
CPropertySheet( LPCTSTR pszCaption, CWnd *pParentWnd = NULL, UINT iSelectPage = 0 );
说明:作为 CPropertySheet类的构造函数之一,可以指定父级窗口,选择当前页面和设置属性页的标题。
— Construct
其原型为:
void Construct( UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0 );
void Construct( LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0 );
说明:另一个 CPropertySheet类的构造函数。当定义CPropertySheet类的对象而没有调用构造函数时,比如定义了CPropertySheet 类的对象数组时,必须显式地调用Construct构造函数。
— GetActiveIndex
其原型为:
int GetActiveIndex( ) const;
说明:用来获得属性框中当前激活页面的索引值。可以 将返回值作为GetPage函数的参数。
— GetPageIndex
其原型为:
int GetPageIndex( CPropertyPage* pPage ) const;
说明:用来获得指定属性页的索引。
— GetPageCount
其原型为:
int GetPageCount( );
说明:用来获得属性页对话框中当前属性页的个数,不 包括已经定义了但是没有调用AddPage函数的属性页。
— GetPage
其原型为:
CPropertyPage* GetPage( int nPage ) const;
说明:用来返回指定索引的属性页的指针。
— GetActivePage
其原型为:
CPropertyPage* GetActivePage( ) const;
说明:用来返回当前激活的属性页的指针。
— SetActivePage
其原型为:
BOOL SetActivePage( int nPage );
BOOL SetActivePage( CPropertyPage* pPage );
说明:用来将指定索引号或指针的属性页设置为激活 页。
— SetTitle
其原型为:
void SetTitle( LPCTSTR lpszText, UINT nStyle = 0 );
说明:用来将设置属性页对话框的标题。
— GetTabControl
其原型为:
CTabCtrl* GetTabControl( );
说明:返回一个指向CTabCtrl类的指针。比如 在初始化过程中想往标签中增加位图时就需要调用GetTabControl函数。
— SetFinishText
其原型为:
void SetFinishText( LPCTSTR lpszText );
说明:在向导对话框中,当完成了所有操作时,在“完 成”(Finish)按钮上设置需要显示的文字,同时隐藏“上一页”( Back)按钮和“下一页”( Next)按钮。
— SetWizardButtons
其原型为:
void SetWizardButtons( DWORD dwFlags );
说明:在向导对话框中设置按钮的显示方式.必须在调 用DoModal函数之后才可以调用SetWizardButtons函数。在属性页中可以通过调用 CPropertyPage::OnSetActive函数来判断。
— SetWizardMode
其原型为:
void SetWizardMode( );
说明:设置属性页对话框为向导对话框模式。应该在调 用DoModal函数之前调用SetWizardMode函数。
— DoModal
其原型为:
virtual int DoModal( );
说明:显示一个模态属性页。对于一般属性页,返回值 为IDOKIDCANCEL或者0;对于向导对话框返回值为ID_WIZFINISH或IDCANCEL。
— Create
其原型为:
BOOL Create( CWnd* pParentWnd = NULL, DWORD dwStyle = (DWORD)–1, DWORD dwExStyle = 0 );
说明:显示一个非模态属性页。
— AddPage
其原型为:
void AddPage( CPropertyPage *pPage );
说明:往属性框中增加属性页。按照调用 AddPage函数的顺序从左至右地显示属性页。在调用AddPage函数后,实际上并没有为该页创建相应的窗口,只有当属性页被激活时才为该属性页创建 窗口。
在调试程序的时候,如果属性页对话框可以正常地显示 并不说明所有属性页都正常,应该逐次激活每一个属性页并测试效果。当某个属性页被选中时出现问题,往往是在该属性页的初始化过程中导致的。
— RemovePage
其原型为:
void RemovePage( CPropertyPage *pPage );
void RemovePage( int nPage );
说明:从属性框中去除一个属性页。去除一个属性页的 同时删除与之关联的窗口,但是CPropertyPage类的对象还存在。只有在属性框窗口被关闭后,CProperty