Поделиться через


Пространственная и логическая навигация

Клиенты получают сведения об объекте, пространственно или логически близком к другому объекту в одном контейнере, вызвав IAccess::accNavigate и указав одну из констант навигации.

При использовании клиентов пространственной навигации перейдите к объекту на основе его расположения на экране. Клиенты перемещаются вверх, вниз, слева или справа от текущего объекта, чтобы получить сведения о другом объекте в одном контейнере.

При использовании клиентов логической навигации перейдите к объекту, который логически предшествует или следует другому объекту, как определено сервером. Клиенты переходить ко всем дочерним объектам двумя способами:

Независимо от направления навигация посещает каждый видимый дочерний элемент, принадлежащий родительскому объекту. Невидимые дочерние элементы могут пропускаться с помощью логической навигации. Кроме того, каждый дочерний элемент посещается только один раз, и навигация не циклит вокруг. То есть метод завершается ошибкой, если клиент пытается перейти до первого объекта или после последнего объекта.

Связана пространственная и логическая навигация. Например, на горизонтальной панели инструментов вызов метода с NAVDIR_RIGHT должен выдавать те же результаты, что и вызов метода с NAVDIR_NEXT.

Начальный объект навигации — это объект, который онявляется самозаверяющий или один из дочерних объектов, за исключением случаев, когда указана NAVDIR_FIRSTCHILD или NAVDIR_LASTCHILD. В этом случае навигация должна начинаться с самого объекта.

Если клиент переходит из доступного объекта к элементу пользовательского интерфейса уровня или если элемент lVal varStart CHILDID_SELF, а указанный флаг в navDirэто любой флаг навигации, кроме NAVDIR_FIRSTCHILD или NAVDIR_LASTCHILD, результатом pvarEnd является дочерний идентификатор или интерфейс IDispatch. Если pvarEnd содержит дочерний идентификатор, клиенты должны сначала получить указатель на интерфейс IAccess родительского элемента, чтобы перейти из этого элемента пользовательского интерфейса или получить дополнительные сведения об этом. Чтобы получить родительский объект, клиенты вызывают свойство IAccess::get_accParent объекта-брата или начального объекта навигации.

Обратите внимание, что клиенты должны иметь сведения обо всех плавающих объектах, вызвав функцию EnumChildWindows. Так как плавающий объект не обрезается к родительскому объекту, клиенты не имеют сведений о иерархической связи между двумя объектами рядом друг с другом на экране.

На следующем рисунке показан пример плавающего объекта, который не обрезается к родительскому элементу.

Снимок экрана: открытое окно с плавающей над большим окном студии разработчиков Майкрософт

Установка порядка в логической навигации

В логической навигации разработчики, которые разрабатывают объекты, устанавливают связи между ними. Логическая навигация является более субъективной, чем пространственная навигация. Кроме того, порядок в логической навигации не совпадает с порядком, используемым с дочерними идентификаторами.

Для объектов с расположениями экрана разработчики серверов должны установить порядок навигации таким образом, чтобы большинство пользователей считали логическим. Например, в англоязычных странах или регионах это означает, что слева направо, сверху вниз упорядочение.

Порядок логической навигации должен быть параллельным порядком навигации клавиатуры. Например, диалоговое окно содержит кнопки "ОК " и "Отмена " и несколько элементов управления редактированием. Клиент, вызывающий IAccessible::accNavigate , чтобы перейти к следующему или предыдущему объекту в этом диалоговом окне, перемещается в том же порядке, что и пользователь, нажав клавишу TAB или SHIFT+TAB, чтобы переместить фокус между элементами.

Для объектов, которые не имеют определенных расположений экрана, логический порядок определяется разработчиками сервера, и разработчики клиентов не должны делать никаких предположений об этом. Например, это допустимо для невидимых объектов, таких как объекты, которые временно скрыты, будут перемежаться с видимыми объектами.