介绍 甚至在成为Windows 95的通用控件之前,使用属性表来表示一些选项就已经成为一种很流行的方式。向导模式的属性表通常用来引导用户安装软件或完成其他复杂的工作。WTL对这两种方式的属性表都提供了很好的支持,可以使用前面介绍的与对话框相关的特性,如DDX和DDV。在本章我将演示如何创建一个基本的属性表和向导,如何处理属性页发送的通知消息和事件。
WTL 的属性表类 实现一个属性表需要CPropertySheetWindow和CPropertySheetImpl两个类联合使用,它们都定义在atldlgs.h头文件中。 CPropertySheetWindow类是一个窗口接口类(也就是说是一个CWindow派生类),CPropertySheetImpl有消息映射链和窗口的完整实现,这和ATL的基本窗口类相似,它需要CWindow和CWindowImpl两个类联合使用。
CPropertySheetWindow类封装了对各种PSM_* 消息的处理,例如,SetActivePageByID()封装了PSM_SETCURSELID消息。CPropertySheetImpl类管理一个PROPSHEETHEADER结构和一个HPROPSHEETPAGE类型的数组,CPropertySheetImpl类还提供了
一些方法用来填充PROPSHEETHEADER结构,添加或删除属性页,你也可以使用m_psh成员变量直接操作PROPSHEETHEADER结构。
最后,CPropertySheet类是CPropertySheetImpl类的一个特例,你可以直接使用它而不需要定制整个属性表。 CPropertySheetImpl 的方法
下面是CPropertySheetImpl类的一些重要方法。由于许多方法仅仅是对窗口消息的封装,所以就不在这里列出,你可以查看atldlgs.h中完整的函数清单。
CPropertySheetImpl(_U_STRINGorID title = (LPCTSTR) NULL,UINT uStartPage = 0, HWND hWndParent = NULL) |
CPropertySheetImpl类的构造函数允许你使用一些常用的属性(默认值),所以就不需要在调用其他的方法设置它们。title指定显示在属性表的标题栏的文字,_U_STRINGorID是一个WTL的工具类,它可以自动转换LPCTSTR和资源ID,例如,下面的两行代码都是正确的:
CPropertySheetImpl mySheet ( IDS_SHEET_TITLE ); CPropertySheetImpl mySheet ( _T("My prop sheet") ); |
IDS_SHEET_TITLE 是字符串的ID。 uStartPage 是属性表启动时激活的属性页,是一个从0开始的索引。hWndParent 是属性表的父窗口的句柄。
BOOL AddPage(HPROPSHEETPAGE hPage) BOOL AddPage(LPCPROPSHEETPAGE pPage) |
添加一个属性页。如果这个属性页已经创建了,你可以使用第一个重载函数,使用属性页的句柄(HPROPSHEETPAGE)作为参数。通常是使用第二个重载函数,使用这个重载函数只需设置一个PROPSHEETPAGE数据结构(后面会讲到,它和CPropertyPageImpl一起协同工作),CPropertySheetImpl会为你创建并管理这个属性页。
BOOL RemovePage(HPROPSHEETPAGE hPage) BOOL RemovePage(int nPageIndex) |
移除一个属性页,可以使用属性页的句柄或索引。
BOOL SetActivePage(HPROPSHEETPAGE hPage) BOOL SetActivePage(int nPageIndex) |
设置属性表的活动页面。可以使用属性页的句柄或索引。你可以在属性表创建(显示)之前使用这个方法动态的设置处于激活的属性页。
void SetTitle(LPCTSTR lpszText, UINT nStyle = 0) |
使之属性表窗口的标题文字。nStyle可以是0或PSH_PROPTITLE,如果是PSH_PROPTITLE,则属性表就具有PSH_PROPTITLE样式,这样系统会在你通过lpszText参数指定的窗口标题前添加字符串“Properties for”。
设置PSH_WIZARD样式,将属性表改称向导模式,这个函数必须在属性表显示之前调用。
设置PSH_HASHELP样式,将在属性表中添加帮助按钮。需要注意的是你还要在每个属性页中使帮助按钮可用并提供帮助才能使之生效。
INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) |
创建并显示一个模式的属性表,返回正值表示操作成功,有关PropertySheet() API的帮助文档有有关返回值的详细解释,如果发生错误,属性表无法创建,DoModal()返回-1。
HWND Create(HWND hWndParent = NULL) |
创建并显示一个无模式的属性表,返回值是窗口的句柄,如果发生错误,属性表无法创建,Create()返回NULL。