Использование MSAA для создания доступа к элементу управления ActiveX без окон
В этой статье описывается, как использовать API Microsoft Active Accessibility для обеспечения доступности элемента управления Microsoft ActiveX без окон для клиентских приложений со специальными возможностями (AT).
Это важно знать
Технологии
Предварительные требования
- C/C++
- Программирование Microsoft Win32 и com-модели
- Элементы ActiveX без окон
- Серверы Microsoft Active Accessibility
Инструкции
Шаг 1. Реализация интерфейса IAccessible.
Чтобы сделать элемент Управления ActiveX без окон доступным, необходимо реализовать интерфейс Microsoft Active Accessibility IAccessible так же, как и для оконного элемента управления, за исключением описанных ниже действий. Дополнительные сведения о реализации IAccessible см. в руководстве разработчика для активных серверов специальных возможностей.
Шаг 2. Реализация интерфейса IServiceProvider.
Когда клиент запрашивает сведения о специальных возможностях для вашего элемента управления без окон, контейнер вызывает метод IServiceProvider::QueryService элемента управления для получения указателя интерфейса IAccessible .
В этом примере показано, как реализовать метод 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;
}
Шаг 3. Делегирование IAccessible::get_accParent вызовов метода IAccessibleWindowlessSite::GetParentAccessible сайта элемента управления.
Когда клиент запрашивает родительский объект элемента управления без окон, контейнер вызывает метод IAccessible::get_accParent элемента управления. Реализация get_accParent должна делегироваться методу IAccessibleWindowlessSite::GetParentAccessible контейнера.
В этом примере показано, как реализовать метод 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;
}
Шаг 4. Получение диапазона идентификаторов объектов для назначения источникам событий в элементе управления без окон.
Как и оконные элементы управления, элемент ActiveX без окон вызывает функцию NotifyWinEvent для уведомления клиентов о важных событиях. Параметры функции включают идентификатор объекта элемента, который вызывает событие. Элемент управления без окон должен назначать идентификаторы объектов с помощью значения из диапазона, полученного путем вызова метода IAccessibleWindowlessSite::AcquireObjectIdRange сайта элемента управления.
В этом примере показано, как получить диапазон значений идентификатора объекта из контейнера элементов управления.
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);
Шаг 5. Реализация интерфейса IAccessibleHandler.
Когда элемент управления без окна вызывает функцию NotifyWinEvent , элемент управления указывает идентификатор объекта элемента пользовательского интерфейса, который вызывает событие, и задает контейнер элемента управления в качестве окна, которое будет отвечать на WM_GETOBJECT сообщения от имени элемента управления.
Если клиентское приложение реагирует на событие, контейнер элемента управления получает WM_GETOBJECT сообщение, содержащее идентификатор объекта элемента пользовательского интерфейса, вызвавшим событие. Контейнер элемента управления в ответ ищет элемент управления без окна, который является владельцем идентификатора объекта, а затем вызывает метод IAccessibleHandler::AccessibleObjectFromID этого элемента управления. Метод AccessibleObjectFromID возвращает указатель интерфейса IAccessible для элемента пользовательского интерфейса, а контейнер элемента управления перенаправит указатель на клиентское приложение.
Связанные темы