Usar o MSAA para tornar um controle ActiveX sem janelas acessível
Descreve como usar a API de Acessibilidade Ativa da Microsoft para garantir que o controle Microsoft ActiveX sem janelas esteja acessível a aplicativos cliente at (tecnologia adaptativa).
O que você precisa saber
Tecnologias
Pré-requisitos
- C/C++
- Programação do Microsoft Win32 e do COM (Component Object Model)
- Controles ActiveX sem janelas
- Servidores de Acessibilidade Ativa da Microsoft
Instruções
Etapa 1: implementar a interface IAccessible.
Para tornar o controle ActiveX sem janelas acessível, você deve implementar a interface IAccessible de Acessibilidade Ativa da Microsoft, assim como faria para um controle baseado em janela, exceto conforme descrito nas etapas a seguir. Para obter mais informações sobre como implementar o IAccessible, consulte Guia do desenvolvedor para servidores de acessibilidade ativos.
Etapa 2: implementar a interface IServiceProvider.
Quando um cliente solicita informações de acessibilidade sobre seu controle sem janelas, o contêiner chama o método IServiceProvider::QueryService do controle para recuperar o ponteiro da interface IAccessible .
Este exemplo mostra como implementar o método QueryService .
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 chamadas de método IAccessible::get_accParent para o método IAccessibleWindowlessSite::GetParentAccessible do site de controle.
Quando um cliente solicita o objeto pai do controle sem janelas, o contêiner chama o método IAccessible::get_accParent do controle. Sua implementação de get_accParent deve delegar ao método IAccessibleWindowlessSite::GetParentAccessible 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 evento em seu controle sem janelas.
Como controles baseados em janela, um controle ActiveX sem janelas chama a função NotifyWinEvent para notificar os clientes sobre eventos importantes. Os parâmetros de função incluem a ID do objeto do item que está acionando o evento. Seu controle sem janelas deve atribuir IDs de objeto usando um valor de um intervalo adquirido chamando o método IAccessibleWindowlessSite::AcquireObjectIdRange do site de controle.
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 janelas chama a função NotifyWinEvent , o controle especifica a ID do objeto do item de interface do usuário que está acionando o evento e especifica o contêiner de controle como a janela que responderá a mensagens WM_GETOBJECT 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 de interface do usuário que gerou o evento. O contêiner de controle responde pesquisando o controle sem janelas que "possui" a ID do objeto e chamando o método IAccessibleHandler::AccessibleObjectFromID desse controle. O método AccessibleObjectFromID retorna o ponteiro de interface IAccessible para o item de interface do usuário e o contêiner de controle encaminha o ponteiro para o aplicativo cliente.
Tópicos relacionados