Partilhar via


Expondo controles com base em controles do sistema

Você deve considerar o uso de alguma forma de Anotação Dinâmica — Direta, Mapa de Valor ou Servidor — antes de tentar a técnica descrita nesta seção. Para mais informações, consulte a API de Anotação Dinâmica .

Na maioria dos casos, o Microsoft Ative Accessibility expõe informações sobre controles superclassificados ou subclassificados. Superclassificação e subclassificação permitem que um desenvolvedor de aplicativos crie um controle personalizado com a funcionalidade básica de um controle de sistema e inclua aprimoramentos fornecidos pelo aplicativo. Um controle superclassificado tem um nome de classe de janela diferente do controle do sistema no qual ele se baseia. Um controle subclassificado tem o mesmo nome de classe de janela. Para obter mais informações sobre superclassificação e subclassificação, consulte a documentação do Windows Software Development Kit (SDK).

Como o Microsoft Ative Accessibility expõe informações sobre controles fornecidos pelo sistema, o Microsoft Ative Accessibility expõe o controle modificado, a menos que um controle superclassificado ou subclassificado seja significativamente diferente do controle base. Para determinar se o controle modificado está acessível, os desenvolvedores de aplicativos devem usar utilitários como Inspect e Accessible Event Watcher para comparar o comportamento do controle modificado com o controle base.

Se depois de usar esses utilitários você determinar que o controle modificado não está acessível, você deve tratar o controle como qualquer outro controle personalizado. O controlo deve disparar eventos, e o procedimento da janela da aplicação deve responder à mensagem WM_GETOBJECTfornecendo uma interface IAccessible que é utilizada por aplicações cliente para obter informações sobre o controlo.

CreateStdAccessibleProxy e CreateStdAccessibleObject

Se todas ou a maioria das propriedades IAccessible para o controle modificado forem as mesmas que o controle base, use CreateStdAccessibleProxy ou CreateStdAccessibleObject para simplificar a implementação da interface IAccessible do controle.

Observação

Ao sobreclassificar ou subclassificar um controle acessível, esteja ciente de que o objeto recuperado pela funçãoCreateStdAccessibleObject pode implementar mais do que apenas a interfaceIAccessible. Pode incluir outras interfaces como IEnumVARIANT. Talvez seja necessário encapsular essas interfaces adicionais para manter o suporte de acessibilidade fornecido pela implementação original do controle.

 

As funções CreateStdAccessibleProxy e CreateStdAccessibleObject recuperam um ponteiro de interface IAccessible para o controlo de sistema especificado. A diferença dessas funções é que CreateStdAccessibleObject usa o nome da classe janela obtido do seu parâmetro hwnd, ao passo que CreateStdAccessibleProxy usa o nome da classe janela especificado no seu parâmetro szClassName. Portanto, se você decidir usar essas funções, use CreateStdAccessibleProxy para expor informações sobre controles superclassificados e qualquer função com controles subclassificados.

Depois de obter um ponteiro de interface IAccessible para o controlo do sistema, utilize o ponteiro na sua implementação da interface IAccessible para o controlo modificado. Se uma propriedade ou método para o controle modificado for o mesmo que o controle base, use o ponteiro IAccessible para retornar as informações fornecidas pelo controle base. Se uma propriedade para o controle modificado for diferente do controle base, substitua a propriedade do controle base.

No exemplo a seguir, CAccCustomButton é a classe definida pelo aplicativo derivada de IAccessible. A variável membro m_pAccDefaultButton é um ponteiro para uma interface IAccessible que foi recuperada de CreateStdAccessibleObject durante o procedimento de inicialização para o controle. Neste exemplo, a propriedade Role para o controle personalizado é a mesma que a propriedade Role do controle do sistema, portanto, a propriedade Role do controle base é retornada. No entanto, a propriedade Description é diferente da propriedade do controle base, portanto, essa propriedade é substituída.

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 obter mais informações sobre o IAccessible propriedades e métodos de controles do sistema, consulte Apêndice A: Elementos de interface do usuário suportados.