Win32 API 日本語リファレンス
ホーム › UI.Accessibility › LPFNACCESSIBLECHILDREN

LPFNACCESSIBLECHILDREN

コールバック

シグネチャ

HRESULT LPFNACCESSIBLECHILDREN(
    IAccessible* paccContainer,
    INT iChildStart,
    INT cChildren,
    VARIANT* rgvarChildren,
    INT* pcObtained
);

パラメーター

フィールド型説明
paccContainerIAccessible*コンテナーオブジェクトの IAccessible インターフェイスへのポインターです。
iChildStartINT最初に取得する子の、0から始まるインデックスを指定します。このパラメーターはインデックスであり、子IDではありません。通常は 0 を設定します。
cChildrenINT取得する子の数を指定します。現在の子の数を取得するには、アプリケーションは IAccessible::get_accChildCount を呼び出します。
rgvarChildrenVARIANT*コンテナーの子に関する情報を受け取る VARIANT 構造体の配列へのポインターです。配列要素の vt メンバーが VT_I4 の場合、その要素の lVal メンバーが子IDです。配列要素の vt メンバーが VT_DISPATCH の場合、その要素の pdispVal メンバーは子オブジェクトの IDispatch インターフェイスのアドレスです。
pcObtainedINT*AccessibleChildren 関数によって設定された rgvarChildren 配列の要素数を受け取る変数のアドレスです。この値は cChildren パラメーターの値と同じですが、実際に存在する数より多くの子を要求した場合は、cChildren の値より小さくなります。

公式ドキュメント

アクセス可能なコンテナーオブジェクト内にある各子要素の子IDまたは IDispatch を取得します。

戻り値

Type: STDAPI

成功した場合は S_OK を返します。

失敗した場合は、次のいずれか、またはその他の標準的な COM エラーコード を返します。

戻り値 説明
E_INVALIDARG
引数が有効ではありません。
S_FALSE
関数は成功しましたが、rgvarChildren 配列の要素数が cChildren で要求した子の数より少なくなっています。

解説(Remarks)

コンテナー内のすべての子に関する情報を取得するには、iChildStart パラメーターを 0 にし、cChildren には IAccessible::get_accChildCount が返した値を指定する必要があります。

ユーザーインターフェイス要素の子に関する情報を得るためにこの関数を呼び出す場合、クライアントはすべての子の情報を取得することが推奨されます。つまり、iChildStart は 0 とし、cChildren は IAccessible::get_accChildCount が返した値とする必要があります。

要素に対して子IDが返された場合、その子要素に関する情報はコンテナーが提供する必要があります。要素の情報を取得するには、クライアントはコンテナーの IAccessible インターフェイスポインターを使用し、IAccessible のプロパティを呼び出す際に取得した子IDを指定します。

クライアントは、この関数によって取得したすべての IDispatch インターフェイスに対して IUnknown::Release メソッドを呼び出し、配列が不要になった時点で解放する必要があります。

例

次の例の関数は、渡された要素より下位の要素ツリーのビューを表示します。各要素の名前とロールは、ここには示していないユーザー定義の関数によって出力されます。


HRESULT WalkTreeWithAccessibleChildren(IAccessible* pAcc, int depth)
{
    HRESULT hr;
    long childCount;
    long returnCount;

    if (!pAcc)
    {
        return E_INVALIDARG;
    }
    hr = pAcc->get_accChildCount(&childCount);
    if (FAILED(hr))
    {
        return hr;
    };
    if (childCount == 0)
    {
        return S_FALSE;
    }
    VARIANT* pArray = new VARIANT[childCount];
    hr = AccessibleChildren(pAcc, 0L, childCount, pArray, &returnCount);
    if (FAILED(hr))
    {
        return hr;
    };

    // Iterate through children.
    for (int x = 0; x < returnCount; x++)
    {
        VARIANT vtChild = pArray[x];
        // If it's an accessible object, get the IAccessible, and recurse.
        if (vtChild.vt == VT_DISPATCH)
        {
            IDispatch* pDisp = vtChild.pdispVal;
            IAccessible* pChild = NULL;
            hr = pDisp->QueryInterface(IID_IAccessible, (void**) &pChild);
            if (hr == S_OK)
            {
                for (int y = 0; y < depth; y++)
                {
                    printf("  ");
                }
                PrintName(pChild, CHILDID_SELF);
                printf("(Object) ");
                PrintRole(pChild, CHILDID_SELF);
                WalkTreeWithAccessibleChildren(pChild, depth + 1);
                pChild->Release();
            }
            pDisp->Release();
        }
        // Else it's a child element so we have to call accNavigate on the parent,
        //   and we do not recurse because child elements can't have children.
        else
        {
            for (int y = 0; y < depth; y++)
            {
                printf("  ");
            }
            PrintName(pAcc, vtChild.lVal);
            printf("(Child element) ");
            PrintRole(pAcc, vtChild.lVal);
        }
    }
    delete[] pArray;
    return S_OK;
}
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)