Use o MSAA para tornar acessível um controle ActiveX sem janelas
Descreve como usar a API de Acessibilidade Ativa da Microsoft para garantir que seu controle Microsoft ActiveX sem janelas esteja acessível a aplicativos cliente de tecnologia assistiva (AT).
O que precisa de saber
Tecnologias
Pré-requisitos
- C/C++
- Programação do Microsoft Win32 e COM (Component Object Model)
- Controles ActiveX sem janela
- Servidores Microsoft Active Accessibility
Instruções
Passo 1: Implementar a interface IAccessible.
Para tornar o controlo ActiveX sem janela acessível, você deve implementar a interface Microsoft Active Accessibility IAccessible , assim como faria para um controlo baseado em janela, exceto conforme descrito nos passos a seguir. Para obter mais informações sobre como implementar IAccessible, consulte Guia do desenvolvedor para servidores de acessibilidade ativa.
Etapa 2: Implementar a interface IServiceProvider.
Quando um cliente solicita informações de acessibilidade sobre o seu controle sem janelas, o contêiner chama o método IServiceProvider::QueryService do seu controle para recuperar o ponteiro da interface IAccessible.
Este exemplo mostra como implementar o QueryService método.
STDMETHODIMP CMyAccessibleMSAAControl::QueryService(REFGUID guidService,
REFIID riid, void **ppvObject)
{
if (ppvObject == NULL)
{
return E_INVALIDARG;
}
*ppvObject = NULL;
HRESULT hr = E_FAIL;
if (guidService == __uuidof(IAccessible))
{
hr = QueryInterface(riid, ppvObject);
}
return hr;
}
Etapa 3: Delegar as chamadas ao método IAccessible::get_accParent para o método IAccessibleWindowlessSite::GetParentAccessible do site de controlo.
Quando um cliente solicita o objeto pai do seu controle sem janela, o contêiner chama o método IAccessible::get_accParentdo seu controle. Sua implementação get_accParent deve delegar ao IAccessibleWindowlessSite::GetParentAccessible método do contêiner.
Este exemplo mostra como implementar o método get_accParent.
HRESULT CMyAccessibleMSAAControl::get_accParent(IDispatch **ppdispParent)
{
if (ppdispParent == NULL)
{
return E_INVALIDARG;
}
HRESULT hr = S_FALSE;
*ppdispParent = NULL;
IAccessibleWindowlessSite *pWindowlessSite = NULL;
if (SUCCEEDED(m_pClientSite->QueryInterface(IID_PPV_ARGS(&pWindowlessSite))))
{
IAccessible *pParentAcc = NULL;
if (SUCCEEDED(pWindowlessSite->GetParentAccessible(&pParentAcc)))
{
hr = pParentAcc->QueryInterface(IID_PPV_ARGS(ppdispParent));
}
}
SafeRelease(&pWindowlessSite);
return hr;
}
Etapa 4: Adquira um intervalo de IDs de objeto para atribuir às fontes de eventos em seu controle sem janelas.
Como controles baseados em janela, um controle ActiveX sem janela chama a funçãoNotifyWinEvent para notificar os clientes sobre eventos importantes. Os parâmetros de função incluem a ID do objeto do item que está gerando o evento. Seu controle sem janela deve atribuir IDs de objeto usando um valor de um intervalo adquirido chamando o do site de controle IAccessibleWindowlessSite::AcquireObjectIdRange método.
Este exemplo mostra como adquirir um intervalo de valores de ID de objeto do contêiner de controle.
IAccessibleWindowlessSite *pWindowlessSite = NULL;
if (SUCCEEDED(m_pClientSite->QueryInterface(
IID_PPV_ARGS(&pWindowlessSite))))
{
if (FAILED(pWindowlessSite->AcquireObjectIdRange(100, this,
&m_idObjectBase)))
{
m_idObjectBase = -1;
}
}
SafeRelease(&pWindowlessSite);
Etapa 5: Implementar a interface IAccessibleHandler.
Quando um controle sem janela chama a funçãoNotifyWinEvent, o controle especifica a ID do objeto do item da interface do usuário que está gerando o evento e especifica o contêiner de controle como a janela que responderá a WM_GETOBJECT mensagens em nome do controle.
Se um aplicativo cliente responder ao evento, o contêiner de controle receberá uma mensagem WM_GETOBJECT que inclui a ID do objeto do item da interface do usuário que gerou o evento. O contêiner de controle responde procurando o controle sem janela que "possui" a ID do objeto e, em seguida, chamando o do controle IAccessibleHandler::AccessibleObjectFromID método. O método AccessibleObjectFromID retorna o ponteiro da interface IAccessible para o elemento de interface do utilizador, e o contêiner de controlo encaminha o ponteiro para a aplicação cliente.
Tópicos relacionados