Pocket PC 2002 中的属性表回调





4.00/5 (7投票s)
如何在 Pocket PC 属性表中使用 MFC 插入标题和页脚链接
引言
本文介绍了 Pocket PC 2002 属性表的一个鲜为人知的特性:如何包含带有链接的标题和页脚。标题和页脚都将显示在属性表的所有页面中。本文还演示了如何像标准 CDialog
一样隐藏应用程序菜单栏。
回调
标题和页脚都是通过 MFC 处理的所有属性表中都存在的回调函数实现的,通过 CPropertySheet
。回调函数地址存储在 CPropertySheet
的 m_psh
成员中存储的 PROPSHEETHEADER
结构的 pfnCallback
成员中。创建属性表时,MFC 将使用其自身的处理程序 AfxPropSheetCallback
的地址填充此指针。此回调处理 PSCB_INITIALIZED
和 PSCB_GETVERSION
消息。 这是将选项卡放在底部并报告属性表正在使用的控件版本所必需的。 但是,我们可以通过此回调做更多的事情:我们可以使用它来插入标题和页脚,就像演示项目中的属性表一样(请参见图片)。
为了访问这些功能,我们必须在回调中处理 PSCB_GETTITLE
和 PSCB_GETLINKTEXT
消息。问题是 MFC 已经为属性表提供了一个回调,那么我们如何提供自己的回调函数呢?答案很简单:我们钩住它。
CCePropertySheet
所有相关代码都在 CCePropertySheet
类中。此类派生自 MFC 的 CPropertySheet
,并在以下方面专门化其功能
- 提供标准
CCeCommandBar
; - 插入从构造函数参数中获取的标题;
- 允许用户插入带有可选链接的页脚。
使用 CCePropertySheet
使用此类非常简单
CLinkSheet dlg(_T("Link")); dlg.SetLink(_T("Start <file:pword.exe{Word}>")); dlg.DoModal();
第一行声明对象(派生自 CCePropertySheet
)。 第二行设置页脚链接文本。 最后,调用对话框。
实现 CCePropertySheet
正如您可以从源代码中看到的那样,该类并不复杂。
我们要做的第一件事是钩住回调函数(请参见 HookCallback
)。 此函数是从构造函数中调用的,我们在构造函数中将工作表的标题存储在静态 CString
中。 调用 HookCallback
时,MFC 已经将其自身的回调函数指针存储在 m_psh.pfnCallback
中。 该指针存储在静态成员中,并由该类自身的回调替换。
提供回调非常简单。 检查并提供标题和链接消息。 始终调用 MFC 回调来处理消息,因此我们保留了所有已知的功能。 提供消息意味着将特定字符串复制到 lParam
给定的地址。
最后,OnInitDialog
处理程序用于创建空的 CCeCommandBar
。 除了隐藏应用程序的命令栏外,这还可以用作常规命令栏,这意味着您可以插入菜单和按钮。
请注意,m_strLink
和 m_strTitle
都是静态成员变量。 这是必需的,因为它们都由必须是静态的回调函数引用(不会在参数列表中接收隐式 this
)。 另外,请注意,这些变量仅在属性表创建周期内访问一次。 如果需要创建第二个属性表作为第一个属性表发出的命令的结果,则可以确定重写的字符串值不会对第一个属性表产生影响。
谢谢
- 感谢 Vladimir Romanov 对此主题的记录。 您可以在以下链接中找到它:http://discuss.cewindows.net/ubb/Forum50/HTML/000081.html。
- 感谢 Vassili Philippov 提供插入命令栏的代码。 您可以在此链接中找到它:http://www.pocketpcdn.com/articles/fullscreen_propertysheet.html。
- 感谢 Daniel S. 的敏锐眼光!