Поделиться через


Предоставление элементов управления на основе системных элементов управления

Прежде чем пытаться использовать метод, описанный в этом разделе, следует использовать определенную форму динамической заметки — прямую, карту значений или сервер. Дополнительные сведения см. в разделе API динамических заметок.

В большинстве случаев microsoft Active Accessibility предоставляет сведения о надклассовых или подклассовых элементах управления. Суперклассирование и подклассы позволяют разработчику приложений создавать пользовательский элемент управления с основными функциями системного элемента управления и включать усовершенствования, предоставляемые приложением. Имя класса окна надклассового элемента управления отличается от имени системного элемента управления, на котором он основан. Подклассованный элемент управления имеет то же имя класса окна. Дополнительные сведения о надклассовом и подклассах см. в документации по пакету средств разработки программного обеспечения (SDK) для Windows.

Так как Microsoft Active Accessibility предоставляет сведения о системных элементах управления, Microsoft Active Accessibility предоставляет измененный элемент управления, если только надклассовый или подклассовый элемент управления существенно не отличается от базового элемента управления. Чтобы определить, доступен ли измененный элемент управления, разработчикам приложений следует использовать такие служебные программы, как Проверка и Наблюдатель за событиями доступности , чтобы сравнить поведение измененного элемента управления с базовым элементом управления.

Если после использования этих служебных программ вы определите, что измененный элемент управления недоступен, необходимо рассматривать элемент управления как любой другой пользовательский элемент управления. Элемент управления должен активировать события, а оконная процедура приложения должна реагировать на сообщение 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 во время процедуры инициализации элемента управления. В этом примере свойство Role для настраиваемого элемента управления совпадает со свойством Role системного элемента управления, поэтому возвращается свойство Role базового элемента управления. Однако свойство 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 системных элементов управления см. в приложении А. Справочник по поддерживаемым элементам пользовательского интерфейса.