MFC程序员WTL指南(9)属性页与向导
2008-01-19 20:26:45 来源:WEB开发网设置PSH_HASHELP样式,将在属性表中添加帮助按钮。需要注意的是你还要在每个属性页中使帮助按钮可用并提供帮助才能使之生效。
INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())
创建并显示一个模式的属性表,返回正值表示操作成功,有关PropertySheet() API的帮助文档有有关返回值的详细解释,如果发生错误,属性表无法创建,DoModal()返回-1。
HWND Create(HWND hWndParent = NULL)
创建并显示一个无模式的属性表,返回值是窗口的句柄,如果发生错误,属性表无法创建,Create()返回NULL。
WTL 的属性页类WTL对属性页的封装类与属性表的封装类相似,有一个窗口接口类 CPropertyPageWindow 和一个实现类 CPropertyPageImpl 。CPropertyPageWindow 很小,包含最常用的需要在作为父窗口的属性表中调用的方法。
CPropertyPageImpl 是从 CDialogImplBaseT派生,由于属性页是从对话框资源中创建的,这就意味着所有可以在对话框中使用的WTL的特性都可以在属性页中使用,如DDX和DDV。CPropertyPageImpl 有两个主要作用:管理一个PROPSHEETPAGE数据结构(保存在成员变量m_psp中),处理所有PSN_开头的通知消息。对于很简单的属性页可以直接使用CPropertyPage类,这个类只适合与用户没有任何交互的属性页,例如“关于”页面或者向导中的介绍页面
也可以创建含有ActiveX控件的属性页。首先,这需要在stdafx.h文件中添加对atlhost.h的包含,还要使用CAxPropertyPageImpl代替CPropertyPageImpl。对于简单的页面可以使用CAxPropertyPage代替CPropertyPage。
CPropertyPageImpl 的方法CPropertyPageImpl 管理着一个 PROPSHEETPAGE 结构,也就是公有成员 m_psp。CPropertyPageImpl还重载了PROPSHEETPAGE*操作符,所以你可以将CPropertyPageImpl传递给需要LPPROPSHEETPAGE 或 LPCPROPSHEETPAGE 类型的参数的方法,例如CPropertySheetImpl::AddPage()。
CPropertyPageImpl的构造函数允许你设置页面的标题,标题通常显示在页面的Tab标签上:
CPropertyPageImpl(_U_STRINGorID title = (LPCTSTR) NULL)
如果你不想让属性表创建属性页面而是想手工创建页面,你可以调用Create():
HPROPSHEETPAGE Create()
Create() 只是调用用m_psp做参数调用了 CreatePropertySheetPage() 。如果你向一个已经创建的属性表添加属性页或者向另一个不在控制的属性表添加属性页(例如,处理系统Shell扩展的属性表),那就只需要调用Create()函数。
下面的三个方法用于设置属性页的各种标题文本:
void SetTitle(_U_STRINGorID title)
void SetHeaderTitle(LPCTSTR lpstrHeaderTitle)
void SetHeaderSubTitle(LPCTSTR lpstrHeaderSubTitle)
第一个方法改变页面标签的文字,另外几个用来设置Wizard97样式的向导中属性页顶部的文字。
void EnableHelp()
设置m_psp中的PSP_HASHELP标志,当本页面激活时使属性表的帮助按钮可用。
处理通知消息CPropertyPageImpl有一个消息映射处理WM_NOTIFY。如果通知代码是PSN_*的值,OnNotify()就会调用相应的通知处理函数。这使用了编译阶段虚函数机制,从而使得派生类可以很容易的重载这些处理函数。
由于WTL 3和WTL 7设计的改变,从而存在两套不同的通知处理机制。在WTL 3中通知处理函数返回的值与PSN_*消息的返回值不同,例如,WTL 3是这样处理PSN_WIZFINISH的:
case PSN_WIZFINISH:
lResult = !pT->OnWizardFinish();
break;
更多精彩
赞助商链接