空间和逻辑导航

客户端通过调用 IAccessible::accNavigate 并指定导航 常量之一,检索有关空间上或逻辑上靠近同一容器中另一个对象的信息。

使用 空间导航 ,客户端根据对象在屏幕上的位置导航到该对象。 客户端从当前对象向上、向下、向左或向右导航,以获取有关同一容器中另一个对象的信息。

使用 逻辑导航 ,客户端导航到逻辑上位于另一个对象之前或之后的对象,由服务器确定。 客户端通过两种方式导航到对象的所有子级:

无论方向如何,导航都会访问属于父对象的每个可见子级。 可以使用逻辑导航跳过不可见的子级。 此外,每个子项只访问一次,并且导航不会循环。 也就是说,如果客户端尝试在第一个对象之前或最后一个对象之后导航,方法将失败。

空间导航和逻辑导航是相关的。 例如,在水平工具栏中,使用 NAVDIR_RIGHT 调用 方法应生成与使用 NAVDIR_NEXT 调用 方法相同的结果。

导航的起始对象是它自己的对象或对象的子对象之一,除非指定了NAVDIR_FIRSTCHILDNAVDIR_LASTCHILD;在这种情况下,导航必须从 对象本身开始。

如果客户端从可访问对象导航到同级用户界面元素,或者如果 varStartlVal 成员CHILDID_SELF并且 navDir 中的指定标志是除NAVDIR_FIRSTCHILDNAVDIR_LASTCHILD之外的任何导航标志,则 pvarEnd 的结果为子 ID 或 IDispatch 接口。 如果 pvarEnd 包含子 ID,则客户端必须首先获取指向父级 IAccessible 接口的指针,以便从此用户界面元素导航或获取有关它的详细信息。 为了获取父对象,客户端调用同级对象的 IAccessible::get_accParent 属性或导航的起始对象。

请注意,客户端必须通过调用 EnumChildWindows 函数获取有关所有浮动对象的信息。 由于浮动对象未剪裁到其父对象,因此客户端在屏幕上没有有关两个对象之间的分层关系的信息。

下图是浮动对象的示例,该对象未剪裁到其父对象。

浮动在较大 Microsoft 开发人员工作室窗口上方的打开窗口的屏幕截图

在逻辑导航中建立顺序

在逻辑导航中,设计对象的开发人员在它们之间建立关系。 逻辑导航比空间导航更主观。 此外,逻辑导航中的顺序与子 ID 使用的顺序不同。

对于具有屏幕位置的对象,服务器开发人员应按照大多数用户认为逻辑的方式建立导航顺序。 例如,在英语国家/地区,这意味着从左到右、从上到下的顺序。

逻辑导航顺序必须并行键盘导航顺序。 例如,对话框包含 “确定” 和“ 取消” 按钮以及一些编辑控件。 调用 IAccessible::accNavigate 以导航到该对话框中的下一个或上一个对象的客户端的移动顺序与用户按 TAB 或 SHIFT+TAB 在项目之间移动焦点的顺序相同。

对于未定义屏幕位置的对象,逻辑顺序由服务器开发人员决定,客户端开发人员不应对此做出假设。 例如,不可见对象(例如仅暂时隐藏的对象)可以与可见对象交织在一起。