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.