Compartir a través de


Exponer controles basados en controles del sistema

Debe considerar el uso de algún tipo de anotación dinámica (direct, value map o server) antes de intentar la técnica descrita en esta sección. Para obtener más información, consulte Dynamic Annotation API.

En la mayoría de los casos, La accesibilidad activa de Microsoft expone información sobre los controles superclasados o con subclases. Las superclases y las subclases permiten a un desarrollador de aplicaciones crear un control personalizado con la funcionalidad básica de un control del sistema e incluir mejoras proporcionadas por la aplicación. Un control superclase tiene un nombre de clase de ventana diferente al del control del sistema en el que se basa. Un control con subclases tiene el mismo nombre de clase de ventana. Para obtener más información sobre la superclase y las subclases, consulte la documentación del Kit de desarrollo de software (SDK) de Windows.

Dado que Microsoft Active Accessibility expone información sobre los controles proporcionados por el sistema, Microsoft Active Accessibility expone el control modificado a menos que un control superclase o subclase sea significativamente diferente del control base. Para determinar si el control modificado es accesible, los desarrolladores de aplicaciones deben usar utilidades como Inspect y Accessible Event Watcher para comparar el comportamiento del control modificado con el control base.

Si después de usar estas utilidades determina que el control modificado no es accesible, debe tratar el control como cualquier otro control personalizado. El control debe desencadenar eventos y el procedimiento de ventana de la aplicación debe responder al mensaje de WM_GETOBJECTproporcionando una interfaz IAccessible que las aplicaciones cliente usan para obtener información sobre el control.

CreateStdAccessibleProxy y CreateStdAccessibleObject

Si todas o la mayoría de las propiedades IAccessible para el control modificado son iguales que el control base, use CreateStdAccessibleProxy o CreateStdAccessibleObject para simplificar la implementación de la interfaz IAccessible del control.

Nota

Al superclasar o subclasar un control accesible, tenga en cuenta que el objeto recuperado por la función CreateStdAccessibleObject puede implementar más que simplemente la interfaz IAccessible . Puede incluir otras interfaces como IEnumVARIANT. Es posible que tenga que encapsular estas interfaces adicionales para conservar la compatibilidad de accesibilidad proporcionada por la implementación original del control.

 

Las funciones CreateStdAccessibleProxy y CreateStdAccessibleObject recuperan un puntero de interfaz IAccessible para el control del sistema especificado. La diferencia en estas funciones es que CreateStdAccessibleObject usa el nombre de clase de ventana obtenido de su parámetro hwnd , mientras que CreateStdAccessibleProxy usa el nombre de clase de ventana especificado en su parámetro szClassName . Por lo tanto, si decide usar estas funciones, use CreateStdAccessibleProxy para exponer información sobre los controles superclasados y cualquier función con controles con subclases.

Después de obtener un puntero de interfaz IAccessible al control del sistema, use el puntero en la implementación de la interfaz IAccessible para el control modificado. Si una propiedad o método para el control modificado es la misma que el control base, use el puntero IAccessible para devolver la información proporcionada por el control base. Si una propiedad del control modificado es diferente del control base, invalide la propiedad del control base.

En el ejemplo siguiente, CAccCustomButton es la clase definida por la aplicación derivada de IAccessible. La variable miembro m_pAccDefaultButton es un puntero a una interfaz IAccessible que se recuperó de CreateStdAccessibleObject durante el procedimiento de inicialización del control. En este ejemplo, la propiedad Role del control personalizado es la misma que la propiedad Role del control del sistema, por lo que se devuelve la propiedad Role del control base. Sin embargo, la propiedad Description es diferente de la del control base, por lo que esta propiedad se invalida.

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;
}

Para obtener más información sobre las propiedades y los métodos IAccessibles de los controles del sistema, vea Apéndice A: Referencia de elementos de interfaz de usuario compatibles.