Navegação espacial e lógica
Os clientes recuperam informações sobre um objeto que está espacial ou logicamente próximo a outro objeto dentro do mesmo contêiner chamando IAccessible::accNavigate e especificando uma das constantes de navegação.
Com a navegação espacial, os clientes navegam até um objeto com base em sua localização na tela. Os clientes navegam para cima, para baixo, para a esquerda ou para a direita do objeto atual para obter informações sobre outro objeto dentro do mesmo contêiner.
Com a navegação lógica, os clientes navegam até o objeto que precede ou segue logicamente outro objeto, conforme determinado pelo servidor. Os clientes navegam para todos os filhos de um objeto de duas maneiras:
- Inicie a navegação com NAVDIR_FIRSTCHILD e chame repetidamente o método com NAVDIR_NEXT.
- Inicie a navegação com NAVDIR_LASTCHILD e chame repetidamente o método com NAVDIR_PREVIOUS.
Independentemente da direção, a navegação visita cada filho visível que pertence ao objeto pai. Crianças invisíveis podem ser ignoradas com navegação lógica. Além disso, cada criança é visitada apenas uma vez e a navegação não se repete. Ou seja, o método falhará se um cliente tentar navegar antes do primeiro objeto ou depois do último objeto.
A navegação espacial e lógica estão relacionadas. Por exemplo, em uma barra de ferramentas horizontal, chamar o método com NAVDIR_RIGHT deve produzir os mesmos resultados que chamar o método com NAVDIR_NEXT.
O objeto inicial da navegação é o próprio objetoou um dos filhos do objeto, exceto quando NAVDIR_FIRSTCHILD ou NAVDIR_LASTCHILD é especificado; nesse caso, a navegação deve começar a partir do próprio objeto.
Se um cliente navegar de um objeto acessível para um elemento de interface do usuário irmão ou se o membro lVal de varStart for CHILDID_SELF e o sinalizador especificado em navDir for qualquer sinalizador de navegação, exceto NAVDIR_FIRSTCHILD ou NAVDIR_LASTCHILD, o resultado em pvarEnd será uma ID filho ou uma interface IDispatch. Se pvarEnd contiver uma ID filho, os clientes deverão primeiro obter um ponteiro para a interface IAccessible do pai para navegar desse elemento de interface do usuário ou obter mais informações sobre ele. Para obter o objeto pai, os clientes chamam a propriedade IAccessible::get_accParent do objeto irmão ou do objeto inicial da navegação.
Observe que os clientes devem ter informações sobre todos os objetos flutuantes chamando a função EnumChildWindows. Como um objeto flutuante não é recortado em seu pai, os clientes não têm informações sobre a relação hierárquica entre dois objetos próximos um do outro na tela.
O gráfico a seguir é um exemplo de um objeto flutuante que não está preso ao pai.
Estabelecendo a ordem na navegação lógica
Na navegação lógica, os desenvolvedores que projetam os objetos estabelecem as relações entre eles. A navegação lógica é mais subjetiva do que a navegação espacial. Além disso, a ordem na navegação lógica não é a mesma que a ordem usada com IDs filho.
Para objetos que têm locais de tela, os desenvolvedores de servidor devem estabelecer a ordem de navegação da maneira que a maioria dos usuários consideraria lógica. Em países/regiões de língua inglesa, por exemplo, isso significa uma ordem da esquerda para a direita, de cima para baixo.
A ordem de navegação lógica deve ser paralela à ordem de navegação do teclado. Por exemplo, uma caixa de diálogo contém os botões OK e Cancelar e alguns controles de edição. Um cliente que chama IAccessible::accNavigate para navegar até o objeto seguinte ou anterior nessa caixa de diálogo se move na mesma ordem que um usuário que pressiona TAB ou SHIFT+TAB para mover o foco entre os itens.
Para objetos que não têm locais de tela definidos, a ordem lógica é decidida pelos desenvolvedores do servidor e os desenvolvedores do cliente não devem fazer suposições sobre isso. Por exemplo, é aceitável que objetos não visíveis, como objetos que estão apenas temporariamente ocultos, sejam intercalados com objetos visíveis.