创建更易理解的动态注释用户界面
Microsoft Corporation
2000年9月
摘要: :作为 Microsoft Active Accessibility 2.0 系列的第一篇文章,本文论述了动态注释 (DA),一种使开发人员提高用户界面可用性的新技术。
目录
前面的文章介绍了作为 Microsoft Active Accessibility 1.0 的一部分的 IAccessible 界面,并说明了 oleacc.dll 为标准控件(USER 和 ComCtl)提供了该界面的默认实现。这些文章使开发人员在使用自己绘制的和自定义控件时避免破坏默认实现。有关详细信息,请参阅 Microsoft Active Accessibility: Part 1(英文)(另在 MSDN News 的 2000 年 5/6 月刊) 和 Microsoft Active Accessibility: Part 2(英文)(另在 MSDN News 的 2000 年 7/8 月刊)。
本文是讨论 Active Accessibility 2.0 及其新功能系列文章的第一篇。作为这些功能之一的动态注释 (DA) 与前面文章中讨论的技术相比,为自定义辅助功能信息提供了更好的灵活性并明显降低了开发成本。
Active Accessibility 组件 oleacc.dll 创建代表标准 Microsoft Windows? 控件实现 IAccessible 的代理对象。由于这些代理使用标准 Windows 消息和控件专用 API 收集每个控件的信息,因此没有直接的机制自定义这些代理通过 IAccessible 提供的信息。
动态注释允许开发人员将提示和其他有用信息传递给 OLEACC 来自定义其提供的信息。该功能本身将降低支持 Active Accessibility 的成本,使开发人员大大改进用户界面的辅助功能。
还有其他方法可以为界面元素提供自定义 IAccessible 支持,在某些场合它们是正确的解决方案。实际上,在引入注释之前,这些技术是开发人员的唯一选择。
第一种替代方法是实现整个 IAccessible 界面。自定义控件或不同用户界面元素通常需要该方法,但是开发和测试成本明显太高,因此除非真正必要否则应该避免采用。如果目标是更改单个属性,则成本难以判断。
第二种方法是使用子类和封装技术修改指定属性的信息。这是动态注释要替代的技术。要使用子类和封装重载单个属性,开发人员必须:
- 使 IAccessible 对象的 HWND 成为子类。
- 截取 WM_GETOBJECT 获得正确 lParam/OBJID 值。
- 将 WM_GETOBJECT 通过 CallWndProc() 传递给基类。如果返回 0,则调用 CreateStdAccessibleObject;否则调用 LresultFromObject 来获得控件本身的 IAccessible。
- 创建封装类,该类实现 IAccessible 并封装了上一步返回的 IAccessible。除需要重载的之外,该封装类将所有方法和属性均传递给原始 IAccessible。这包括编写传递 IAccessible 所有 21 种属性和方法的代码,无论实际重载多少。
- 重载方法和属性必须只处理所需的子 ID,而将所有其他内容传递给原始 IAccessible。
- 如果且仅在原始对象支持的情况下,封装还必须传递 IEnumVARIANT 和 IOleWindow 接口。
- 必须仔细确保正确处理引用计算,特别是如果支持其它界面的话。
- 必须仔细正确处理 IDispatch,特别是 ITypeLib::Invoke(),它必须随指向封装接口的接口指针一起调用,而不是指向原始 IAccessible 接口的指针。
如前所见,这包括相当的工作量,即使只有一个或两个属性需要重载。结果代码的大部分用于子类和封装,只有一小部分结果代码实际执行真正提供重载信息的任务。
Active Accessibility 2.0 中支持三种动态注释:直接注释、数值映射注释和回调注释。每种类型都有它的优点,因此首先要理解哪一种方法适用于指定场合。
注释接口
在继续之前,熟悉注释所涉及的三种主要接口非常重要。由于篇幅所限,我们只对每一种进行高层次的说明。有关详细信息,包括每个界面方法的讨论,可在 Active Accessibility SDK 中找到。
IAccPropServices 接口。这是由单个类 CLSID_AccPropServices 实现的主要注释接口,该类位于 oleacc.dll 中。该接口包含注释访问元素的方法(请参阅表 1)。
表 1. IAccPropServices 接口方法
SetPropValue() | 需要通过一个 VARIANT 变量传递 IAccessibleIdentity 和注释值。 |
SetPropServer() | 用于回调注释。 |
ClearProps() | 阐述属性的注释值,但是这通常不需要,因为注释服务在注释元素销毁时自动清除并释放该信息。 |
SetHwndProp() SetHwndPropStr() SetHwndPropServer() | 这些方法提供 HWND 专用注释。 |
SetHmenuProp() SetHmenuPropStr() SetHmenuPropServer() | 这些方法提供 HMENU 专用注释。
Tags:作者:佚名评论内容只代表网友观点,与本站立场无关! 评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论
本类热门阅览相关文章 |