Compartilhar 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 obter mais informações, consulte API de Anotação Dinâmica.

Na maioria dos casos, a Acessibilidade Ativa da Microsoft expõe informações sobre controles superclasses ou subclasses. A superclasse e a subclasse permitem que um desenvolvedor de aplicativos crie um controle personalizado com a funcionalidade básica de um controle do sistema e inclua aprimoramentos fornecidos pelo aplicativo. Um controle superclasse tem um nome de classe de janela diferente do controle do sistema no qual ele se baseia. Um controle subclasse tem o mesmo nome de classe de janela. Para obter mais informações sobre superclasse e subclasse, consulte a documentação do SDK (Software Development Kit) do Windows.

Como a Acessibilidade Ativa da Microsoft expõe informações sobre controles fornecidos pelo sistema, a Acessibilidade Ativa da Microsoft expõe o controle modificado, a menos que um controle superclasse ou subclasse seja significativamente diferente do controle base. Para determinar se o controle modificado está acessível, os desenvolvedores de aplicativos devem usar utilitários como Inspecionar e Observador de Eventos Acessível 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ê deverá tratar o controle como qualquer outro controle personalizado. O controle deve disparar eventos e o procedimento de janela do aplicativo deve responder à mensagem WM_GETOBJECTfornecendo uma interface IAccessible que os aplicativos cliente usam para obter informações sobre o controle.

CreateStdAccessibleProxy e CreateStdAccessibleObject

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

Observação

Ao superclasse ou subclasse de um controle acessível, lembre-se de que o objeto recuperado pela função CreateStdAccessibleObject pode implementar mais do que apenas a interface IAccessible . Ele pode incluir outras interfaces, como IEnumVARIANT. Talvez seja necessário encapsular essas interfaces adicionais para manter o suporte de acessibilidade fornecido pela implemenação original do controle.

 

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

Depois de obter um ponteiro de interface IAccessible para o controle do sistema, use o ponteiro na implementação da interface IAccessible para o controle 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 de membro m_pAccDefaultButton é um ponteiro para uma interface IAccessible que foi recuperada de CreateStdAccessibleObject durante o procedimento de inicialização do 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 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 as propriedades e métodos IAccessible dos controles do sistema, consulte Apêndice A: Referência de elementos de interface do usuário com suporte.