在Pocket PC2002的属性页中,有一个鲜为人知的特性:如何在属性页中包含标题和页脚,并且这些标题和页脚会在所有页面中显示。此外,本文还将展示如何像标准CDialog一样隐藏应用程序的菜单栏。
标题和页脚是通过在所有MFC处理的属性页中存在的回调函数来实现的,这个回调函数位于CPropertySheet的pfnCallback成员中。当创建一个属性页时,MFC会将这个指针填充为自己的处理程序AfxPropSheetCallback的地址。这个回调处理PSCB_INITIALIZED和PSCB_GETVERSION消息,这是为了将标签放在底部,并报告属性页使用的控件版本。但可以使用这个回调做更多的事情:可以使用它来插入标题和页脚,就像示例项目中的属性页一样(见图片)。
为了访问这些功能,必须在回调中处理PSCB_GETTITLE和PSCB_GETLINKTEXT消息。问题是MFC已经为属性页提供了一个回调,那么如何提供自己的回调函数呢?答案非常简单:钩住它。
所有相关的代码都在CCePropertySheet类中。这个类继承自MFC的CPropertySheet,并在以下方面专门化其功能:
使用这个类非常简单:
CLinkSheet dlg(_T("Link"));
dlg.SetLink(_T("Start "));
dlg.DoModal();
第一行声明了对象(派生自CCePropertySheet)。第二行设置了页脚链接文本。最后,调用对话框。
这个类并不复杂,可以通过源代码看到。首先必须钩住回调函数(见HookCallback)。这个函数在构造函数中被调用,在静态CString中存储了表的标题。当HookCallback被调用时,MFC已经在m_psh.pfnCallback中存储了自己的回调函数指针。该指针存储在静态成员中,并被类的自己的回调替换。
服务回调非常简单。检查并服务标题和链接消息。MFC回调总是被调用以处理消息,因此保留了已经知道的所有功能。服务消息意味着将特定的字符串复制到lParam指定的地址。
最后,OnInitDialog处理程序用于创建一个空的CCeCommandBar。除了隐藏应用程序的命令栏外,这可以像常规命令栏一样使用,意味着可以插入菜单和按钮。
注意,m_strLink和m_strTitle都是静态成员变量。这是必需的,因为它们都是由回调函数引用的,该回调函数本身必须是静态的(不会在参数列表中接收隐式的this)。还请注意,这些变量仅在属性页创建周期中访问一次。如果需要根据第一个属性页发出的命令创建第二个属性页,可以确信覆盖的字符串值不会对第一个属性页产生影响。