空間ナビゲーションと論理ナビゲーション
クライアントは、同じコンテナー内の空間的または論理的に近い別のオブジェクトであるオブジェクトに関する情報を取得する際、IAccessible::accNavigate を呼び出して、いずれかのナビゲーション定数を指定します。
空間ナビゲーションの場合、クライアントは画面上のオブジェクトの位置に基づいてオブジェクトに移動します。 クライアントは、現在のオブジェクトから上下、左右に移動して、同じコンテナー内の別のオブジェクトに関する情報を取得します。
論理ナビゲーションの場合、クライアントは、サーバーによって決定されたとおりに、別のオブジェクトの前または後を論理的に移動するオブジェクトに移動します。 クライアントは、次の 2 つの方法でオブジェクトのすべての子に移動します。
- NAVDIR_FIRSTCHILD を使用してナビゲーションを開始し、NAVDIR_NEXT を使用してメソッドを繰り返し呼び出します。
- NAVDIR_LASTCHILD を使用してナビゲーションを開始し、NAVDIR_PREVIOUS を使用してメソッドを繰り返し呼び出します。
方向に関係なく、ナビゲーションは、その親オブジェクトに属する表示されるそれぞれの子にアクセスします。 非表示の子は、論理ナビゲーションでスキップされる場合があります。 さらに、それぞれの子がアクセスされるのは 1 回のみであり、ナビゲーションはループしません。 つまり、最初のオブジェクトの前または最後のオブジェクトの後にクライアントが移動を試みると、メソッドは失敗します。
空間ナビゲーションと論理ナビゲーションは関連しています。 たとえば、水平ツール バーでは、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 関数を呼び出して、すべての浮動オブジェクトに関する情報を持っている必要があることに注意してください。 浮動オブジェクトは親にクリップされないため、クライアントは画面上で互いに近い 2 つのオブジェクト間の階層関係に関する情報を持っていません。
次の図は、親にクリップされていない浮動オブジェクトの例です。
論理ナビゲーションでの順序の確立
論理ナビゲーションでは、オブジェクトを設計する開発者がオブジェクト間の関係を確立します。 論理ナビゲーションは、空間ナビゲーションよりも主観的です。 また、論理ナビゲーションの順序は、子 ID で使用される順序と同じではありません。
画面上の位置が決まっているオブジェクトの場合、サーバー開発者は、ほとんどのユーザーが論理的とみなす方法でナビゲーションの順序を確立する必要があります。 たとえば、英語圏の国/地域では、これは左から右、上から下への順序を意味します。
論理ナビゲーションの順序は、キーボード ナビゲーションの順序と類似している必要があります。 たとえば、ダイアログ ボックスには、[OK] と [キャンセル] のプッシュ ボタンといくつかの編集コントロールが含まれます。 IAccessible::accNavigate を呼び出してダイアログ ボックス内の次のオブジェクトまたは前のオブジェクトに移動するクライアントは、ユーザーが Tab キーまたは SHIFT+Tab キーを押して項目間でフォーカスを移動するのと同じ順序で移動します。
画面上の位置が定義されていないオブジェクトの場合、論理順序はサーバー開発者によって決定されるため、クライアント開発者はそれに関して想定を行う必要はありません。 たとえば、一時的に非表示になっているオブジェクトなど、表示されないオブジェクトが表示されているオブジェクトと混在していても問題ありません。