システム コントロールに基づくコントロールの公開
このセクションで説明する手法を試す前に、何らかの形式の動的注釈 (Direct、Value Map、または Server) の使用を検討する必要があります。 詳細については、「 動的注釈 API」を参照してください。
ほとんどの場合、Microsoft Active Accessibility は、スーパークラスまたはサブクラス化されたコントロールに関する情報を公開します。 スーパークラスとサブクラス化を使用すると、アプリケーション開発者は、システム コントロールの基本的な機能を使用してカスタム コントロールを作成し、アプリケーションによって提供される拡張機能を含めることができます。 スーパークラスされたコントロールのウィンドウ クラス名は、それが基になっているシステム コントロールとは異なります。 サブクラス化されたコントロールのウィンドウ クラス名は同じです。 スーパークラスとサブクラス化の詳細については、Windows ソフトウェア開発キット (SDK) のドキュメントを参照してください。
Microsoft Active Accessibility はシステム提供のコントロールに関する情報を公開するため、スーパークラスまたはサブクラス化されたコントロールが基本コントロールと大きく異なる場合を除き、Microsoft Active Accessibility は変更されたコントロールを公開します。 変更されたコントロールにアクセスできるかどうかを判断するには、アプリケーション開発者は 、Inspect や Accessible Event Watcher などのユーティリティを使用して、変更されたコントロールの動作と基本コントロールを比較する必要があります。
これらのユーティリティを使用した後、変更されたコントロールにアクセスできないと判断した場合は、コントロールを他のカスタム コントロールとして扱う必要があります。 コントロールはイベントをトリガーする必要があり、アプリケーションのウィンドウ プロシージャは、クライアント アプリケーションがコントロールに関する情報を取得するために使用する IAccessible インターフェイスを提供することで、WM_GETOBJECT メッセージに応答する必要があります。
CreateStdAccessibleProxy と CreateStdAccessibleObject
変更されたコントロールの IAccessible プロパティのすべてまたは大部分が基本コントロールと同じ場合は、 CreateStdAccessibleProxy または CreateStdAccessibleObject を 使用して、コントロールの IAccessible インターフェイスの実装を簡略化します。
Note
アクセス可能なコントロールをスーパークラス化またはサブクラス化する場合は、 CreateStdAccessibleObject 関数によって取得されたオブジェクトが 、単なる IAccessible インターフェイス以外の機能を実装する場合があることに注意してください。 IEnumVARIANT などの他のインターフェイスを含めることができます。 これらの追加のインターフェイスをラップして、コントロールの元の補完によって提供されるアクセシビリティ サポートを維持することが必要になる場合があります。
CreateStdAccessibleProxy 関数と CreateStdAccessibleObject 関数は、指定されたシステム コントロールの IAccessible インターフェイス ポインターを取得します。 これらの関数の違いは、 CreateStdAccessibleObject は hwnd パラメーターから取得したウィンドウ クラス名を使用するのに対し 、CreateStdAccessibleProxy では szClassName パラメーターで指定されたウィンドウ クラス名を使用します。 したがって、これらの関数を使用する場合は、 CreateStdAccessibleProxy を 使用して、スーパークラスされたコントロールに関する情報と、サブクラス化されたコントロールを持ついずれかの関数に関する情報を公開します。
システム コントロールへの IAccessible インターフェイス ポインターを取得した後、変更されたコントロールの IAccessible インターフェイスの実装で ポインターを使用します。 変更されたコントロールのプロパティまたはメソッドが基本コントロールと同じ場合は、 IAccessible ポインターを使用して、基本コントロールによって提供される情報を返します。 変更されたコントロールのプロパティが基本コントロールと異なる場合は、基本コントロールの プロパティをオーバーライドします。
次の例では、 CAccCustomButton は IAccessible から派生したアプリケーション定義クラスです。 m_pAccDefaultButtonメンバー変数は、コントロールの初期化プロシージャ中に CreateStdAccessibleObject から取得された IAccessible インターフェイスへのポインターです。 この例では、カスタム コントロールの Role プロパティはシステム コントロールの Role プロパティと同じであるため、基本コントロールの Role プロパティが返されます。 ただし、 Description プロパティは基本コントロールとは異なるため、このプロパティはオーバーライドされます。
HRESULT CAccCustomButton::Initialize( HWND hWnd, HINSTANCE hInst )
{
.
.
.
hr = CreateStdAccessibleObject( m_hWnd,
OBJID_CLIENT,
IID_IAccessible,
(void **) &m__pAccDefaultButton );
.
.
.
}
STDMETHODIMP CAccCustomButton::get_accRole( VARIANT varID )
{
return m_pAccDefaultButton->get_accRole(varID);
}
STDMETHODIMP CAccCustomButton::get_accDescription( VARIANT varChild,
BSTR* pszDesc )
{
TCHAR szString[256];
OLECHAR wszString[256];
LoadString( m_hInst, ID_DESCRIPTION, szString, 256 );
MultiByteToWideChar( CP_ACP, 0, szString, -1, wszString, 256 );
*pszDesc = SysAllocString( wszString );
if ( !pszDesc )
return S_OK;
else
return E_OUTOFMEMORY;
}
システム コントロールの IAccessible プロパティとメソッドの詳細については、「 付録 A: サポートされているユーザー インターフェイス要素リファレンス」を参照してください。