空间和逻辑导航
客户端通过调用 IAccessible::accNavigate 并指定其中一个导航常量,检索同一容器中空间或逻辑上靠近另一个对象的信息。
使用空间导航客户端,根据其在屏幕上的位置导航到对象。 客户端从当前对象向上、向下、向左或向右导航,以获取同一容器中另一个对象的相关信息。
通过逻辑导航,客户端可导航到逻辑上位于另一个对象之前或之后的对象,具体由服务器确定。 客户端通过两种方式导航到对象的所有子级:
- 使用 NAVDIR_FIRSTCHILD 启动导航,然后使用 NAVDIR_NEXT 重复调用方法。
- 使用 NAVDIR_LASTCHILD 启动导航,并使用 NAVDIR_PREVIOUS 重复调用方法。
无论方向如何,导航都会访问属于父对象的每个可见子级。 可以使用逻辑导航跳过不可见的子级。 此外,每个子级只访问一次,导航不会循环访问。 也就是说,如果客户端尝试在第一个对象之前或最后一个对象之后导航,该方法将会失败。
空间导航和逻辑导航是相关的。 例如,在水平工具栏中,使用 NAVDIR_RIGHT 调用方法应生成与使用 NAVDIR_NEXT 调用方法相同的结果。
导航的起始对象是它本身的对象或对象的子级之一,除非指定了 NAVDIR_FIRSTCHILD 或 NAVDIR_LASTCHILD;在这种情况下,导航必须从对象本身开始。
如果客户端从可访问对象导航到同级用户界面元素,或者 varStart 的 lVal 成员为 CHILDID_SELF 且 navDir 中的指定标志是除 NAVDIR_FIRSTCHILD 或 NAVDIR_LASTCHILD 之外的任何导航标志,则 pvarEnd 的结果为子 ID 或 IDispatch 接口。 如果 pvarEnd 包含子 ID,则客户端必须首先获取指向父级 IAccessible 接口的指针,以便从此用户界面元素导航或获取有关该接口的详细信息。 为了获取父对象,客户端调用同级对象的 IAccessible::get_accParent 属性或导航的起始对象。
请注意,客户端必须通过调用 EnumChildWindows 函数来获取有关所有浮动对象的信息。 由于浮动对象未剪切到其父对象,因此客户端无法获得屏幕上相邻两个对象之间的层次关系信息。
下图是一个浮点对象的示例,该对象未剪裁到其父对象。
在逻辑导航中建立顺序
在逻辑导航中,设计对象的开发人员在它们之间建立关系。 逻辑导航比空间导航更具主观性。 此外,逻辑导航中的顺序与用于子 ID 的顺序不同。
对于具有屏幕位置的对象,服务器开发人员应按照大多数用户认为合乎逻辑的方式建立导航顺序。 例如,在英语国家/地区,这意味着从左到右、从上到下的顺序。
逻辑导航顺序必须与键盘导航顺序一致。 例如,对话框包含确定和取消按钮以及一些编辑控件。 调用 IAccessible::accNavigate 的客户端导航到该对话框中的下一个或上一个对象,其移动顺序与用户按 TAB 或 SHIFT+TAB 在项目之间移动焦点的顺序相同。
对于没有定义屏幕位置的对象,逻辑顺序由服务器开发人员决定,客户端开发人员不应对此做出任何假设。 例如,非可见对象(如只是暂时隐藏的对象)可以与可见对象交错在一起。