Verfügbarmachen von Steuerelementen basierend auf Systemsteuerelementen
Sie sollten eine Form der dynamischen Anmerkung (Direct, Value Map oder Server) verwenden, bevor Sie die in diesem Abschnitt beschriebene Technik versuchen. Weitere Informationen finden Sie unter Dynamische Anmerkungs-API.
In den meisten Fällen macht Microsoft Active Accessibility Informationen zu übergeordneten oder untergeordneten Steuerelementen verfügbar. Überklassen und Unterklassen ermöglichen es einem Anwendungsentwickler, ein benutzerdefiniertes Steuerelement mit der grundlegenden Funktionalität eines Systemsteuerelements zu erstellen und verbesserungen einzubeziehen, die von der Anwendung bereitgestellt werden. Ein übergeordnetes Steuerelement hat einen anderen Fensterklassennamen als das Systemsteuerelement, auf dem es basiert. Ein unterklassiges Steuerelement hat denselben Fensterklassennamen. Weitere Informationen zu Oberklassen und Unterklassen finden Sie in der Dokumentation zum Windows Software Development Kit (SDK).
Da Microsoft Active Accessibility Informationen zu vom System bereitgestellten Steuerelementen verfügbar macht, macht Microsoft Active Accessibility das geänderte Steuerelement verfügbar, es sei denn, ein übergeordnetes oder unterklassiges Steuerelement unterscheidet sich erheblich vom Basissteuerelement. Um zu bestimmen, ob auf das geänderte Steuerelement zugegriffen werden kann, sollten Anwendungsentwickler Hilfsprogramme wie Inspect und Accessible Event Watcher verwenden, um das Verhalten des geänderten Steuerelements mit dem Basissteuerelement zu vergleichen.
Wenn Sie nach der Verwendung dieser Hilfsprogramme feststellen, dass auf das geänderte Steuerelement nicht zugegriffen werden kann, müssen Sie das Steuerelement wie jedes andere benutzerdefinierte Steuerelement behandeln. Das Steuerelement muss Ereignisse auslösen, und die Fensterprozedur der Anwendung muss auf die WM_GETOBJECTNachricht reagieren, indem eine IAccessible-Schnittstelle bereitgestellt wird, die Clientanwendungen zum Abrufen von Informationen zum Steuerelement verwenden.
CreateStdAccessibleProxy und CreateStdAccessibleObject
Wenn alle oder die meisten IAccessible-Eigenschaften für das geänderte Steuerelement mit dem Basissteuerelement identisch sind, verwenden Sie CreateStdAccessibleProxy oder CreateStdAccessibleObject , um die Implementierung der IAccessible-Schnittstelle des Steuerelements zu vereinfachen.
Hinweis
Beachten Sie beim Über- oder Unterklassenieren eines zugriffsfähigen Steuerelements, dass das von der CreateStdAccessibleObject-Funktion abgerufene Objekt möglicherweise mehr als nur die IAccessible-Schnittstelle implementiert. Es kann andere Schnittstellen wie IEnumVARIANT enthalten. Möglicherweise müssen Sie diese zusätzlichen Schnittstellen umschließen, um die Barrierefreiheitsunterstützung beizubehalten, die von der ursprünglichen Implementierung des Steuerelements bereitgestellt wird.
Die Funktionen CreateStdAccessibleProxy und CreateStdAccessibleObject rufen einen IAccessible-Schnittstellenzeiger für das angegebene Systemsteuerelement ab. Der Unterschied in diesen Funktionen besteht darin, dass CreateStdAccessibleObject den Fensterklassennamen verwendet, der aus dem hwnd-Parameter abgerufen wurde, während CreateStdAccessibleProxy den im szClassName-Parameter angegebenen Fensterklassennamen verwendet. Wenn Sie sich daher für die Verwendung dieser Funktionen entscheiden, verwenden Sie CreateStdAccessibleProxy , um Informationen zu übergeordneten Steuerelementen und zu beiden Funktionen mit unterklassierten Steuerelementen verfügbar zu machen.
Nachdem Sie einen IAccessible-Schnittstellenzeiger auf das Systemsteuerelement abgerufen haben, verwenden Sie den Zeiger in Ihrer Implementierung der IAccessible-Schnittstelle für das geänderte Steuerelement. Wenn eine Eigenschaft oder Methode für das geänderte Steuerelement mit dem Basissteuerelement identisch ist, verwenden Sie den IAccessible-Zeiger , um die vom Basissteuerelement bereitgestellten Informationen zurückzugeben. Wenn sich eine Eigenschaft für das geänderte Steuerelement vom Basissteuerelement unterscheidet, überschreiben Sie die Eigenschaft des Basissteuerelements.
Im folgenden Beispiel ist CAccCustomButton die anwendungsdefinierte Klasse, die von IAccessible abgeleitet wird. Die Membervariable m_pAccDefaultButton ist ein Zeiger auf eine IAccessible-Schnittstelle , die während der Initialisierungsprozedur für das Steuerelement aus CreateStdAccessibleObject abgerufen wurde. In diesem Beispiel ist die Role-Eigenschaft für das benutzerdefinierte Steuerelement identisch mit der Role-Eigenschaft des Systemsteuerelements, sodass die Role-Eigenschaft des Basissteuerelements zurückgegeben wird. Die Description-Eigenschaft unterscheidet sich jedoch von der Eigenschaft des Basissteuerelements, sodass diese Eigenschaft überschrieben wird.
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;
}
Weitere Informationen zu den IAccessible-Eigenschaften und -Methoden von Systemsteuerelementen finden Sie unter Anhang A: Referenz zu unterstützten Benutzeroberflächenelementen.