Обеспечение доступности элементов управления на основе системных контролов
Прежде чем попробовать метод, описанный в этом разделе, следует рассмотреть использование какой-либо формы динамической аннотации — прямой, карты значений или сервера. Дополнительные сведения см. в API динамической аннотации.
В большинстве случаев Microsoft Active Accessibility предоставляет сведения о суперклассовых или подклассовых элементах управления. Суперклассирование и подклассы позволяют разработчику приложений создавать пользовательский элемент управления с основными функциями системного элемента управления и включать улучшения, предоставляемые приложением. Суперклассовый элемент управления имеет другое имя класса окна, чем системный элемент управления, на котором он основан. Подклассовый элемент управления имеет то же имя класса окна. Дополнительные сведения о суперклассах и подклассах см. в документации по пакету SDK для Windows.
Так как Active Accessibility от Microsoft предоставляет сведения о системных элементах управления, Active Accessibility от Microsoft предоставляет измененный элемент управления, если суперклассовый или подклассовый элемент управления не значительно отличается от базового элемента управления. Чтобы определить, доступен ли измененный элемент управления, разработчики приложений должны использовать такие утилиты, как Inspect и Accessible Event Watcher для сравнения поведения измененного элемента управления с базовым элементом управления.
Если после использования этих служебных программ вы определяете, что измененный элемент управления недоступен, необходимо рассматривать элемент управления как любой другой пользовательский элемент управления. Элемент управления должен активировать события, и процедура окна приложения должна реагировать на сообщение WM_GETOBJECTпутем предоставления интерфейса IAccessible, который клиентские приложения используют для получения сведений об элементе управления.
CreateStdAccessibleProxy и CreateStdAccessibleObject
Если все или большинство свойств IAccessible для измененного элемента управления совпадают с базовым элементом управления, используйте CreateStdAccessibleProxy или CreateStdAccessibleObject, чтобы упростить реализацию интерфейса IAccessible элемента управления.
Заметка
При суперклассинге или подклассе элемента управления со специальными возможностями следует учитывать, что объект, полученный функцией CreateStdAccessibleObject, может реализовать не только интерфейс IAccessible. Он может включать другие интерфейсы, такие как IEnumVARIANT. Возможно, потребуется упаковать эти дополнительные интерфейсы, чтобы сохранить поддержку специальных возможностей, предоставляемую исходной оболочкой элемента управления.
Функции CreateStdAccessibleProxy и CreateStdAccessibleObject извлекают указатель интерфейса IAccessible для указанного системного элемента управления. Разница в этих функциях заключается в том, что CreateStdAccessibleObject использует имя класса окна, полученное из параметра hwnd, в то время как CreateStdAccessibleProxy использует имя класса окна, указанное в параметре szClassName. Таким образом, если вы решите использовать эти функции, используйте CreateStdAccessibleProxy для предоставления сведений о суперклассовых элементах управления и любой функции с подклассными элементами управления.
После получения указателя интерфейса IAccessible для системного элемента управления используйте указатель в реализации интерфейса IAccessible для модифицированного элемента управления. Если свойство или метод для измененного элемента управления совпадает с базовым элементом управления, используйте указатель IAccessible для возврата сведений, предоставленных базовым элементом управления. Если свойство для измененного элемента управления отличается от базового элемента управления, переопределите свойство базового элемента управления.
В следующем примере CAccCustomButton является классом, производным от IAccessible. Переменная-член m_pAccDefaultButton является указателем на интерфейс IAccessible, который был получен из CreateStdAccessibleObject в ходе процедуры инициализации контрола. В этом примере свойство роли для пользовательского элемента управления совпадает со свойством роли системы, поэтому возвращается свойство роли базового элемента управления. Однако свойство Description отличается от свойства базового элемента управления, поэтому это свойство переопределяется.
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;
}
Дополнительные сведения о свойствах и методах системных элементов управления IAccessible см. в приложении A. Справочник по поддерживаемым элементам пользовательского интерфейса.