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


Размещение элемента управления ActiveX автоматизации пользовательского интерфейса без окон

Узнайте, как создать контейнер элементов управления, который может размещать элементы управления Microsoft ActiveX без окон, реализующие Microsoft модель автоматизации пользовательского интерфейса. С помощью описанных здесь действий можно обеспечить доступность любых модель автоматизации пользовательского интерфейса элементов управления без окон, размещенных в контейнере элементов управления, для клиентских приложений со специальными возможностями (AT).

Это важно знать

Технологии

Предварительные требования

  • C/C++
  • Программирование Microsoft Win32 и com-модели
  • Элементы ActiveX без окон
  • поставщики модель автоматизации пользовательского интерфейса

Инструкции

Шаг 1. Укажите интерфейс IRawElementProviderSimple от имени элемента управления без окон.

Всякий раз, когда системе требуется указатель IRawElementProviderSimple для корня элемента управления без окон, система запрашивает контейнер элемента управления. Чтобы получить указатель, контейнер вызывает реализацию метода IServiceProvider::QueryService в элементе управления без окон.

Если контейнер элемента управления имеет реализацию модель автоматизации пользовательского интерфейса, он может вернуть указатель IRawElementProviderSimple элемента управления без окон на систему.

Если контейнер элемента управления имеет реализацию Microsoft Active Accessibility, вызовите функцию UiaIAccessibleFromProvider , чтобы получить указатель интерфейса IAccessible , представляющий элемент управления, а затем возвратите указатель интерфейса IAccessible в систему.

Шаг 2. Реализация интерфейса IRawElementProviderWindowlessSite.

Контейнер элементов управления реализует интерфейс IRawElementProviderWindowlessSite, позволяющий элементу управления без окон на основе модель автоматизации пользовательского интерфейса передавать сведения о специальных возможностях.

  1. Реализуйте IRawElementProviderWindowlessSite::GetRuntimeIdPrefix.

    Фрагмент элемента управления без окон должен создать уникальный идентификатор среды выполнения для себя. Чтобы создать идентификатор среды выполнения, фрагмент элемента управления без окна получает значение префикса путем вызова метода GetRuntimeIdPrefix сайта элемента управления, а затем добавляет к префиксу целочисленное значение, уникальное по отношению ко всем остальным фрагментам в элементе управления без окон.

    Сайт элемента управления без окон должен реализовывать метод GetRuntimeIdPrefix путем формирования SAFEARRAY , содержащего константу UiaAppendRuntimeId, за которым следует целочисленное значение, уникальное для сайта.

    В этом примере показано, как вернуть префикс идентификатора среды выполнения для элемента управления без окон.

    IFACEMETHODIMP CProviderWindowlessSite::GetRuntimeIdPrefix(   
         SAFEARRAY **ppsaPrefix)   
    {   
        if (ppsaPrefix == NULL) 
        {
            return E_INVALIDARG;
        }
    
        // m_siteIndex is the index of the windowless control's
        // site. It is defined by the control container.
        int rId[] = { UiaAppendRuntimeId, m_siteIndex };
        SAFEARRAY *psa = SafeArrayCreateVector(VT_I4, 0, 2);  
        if (psa == NULL)
        {
            return E_OUTOFMEMORY;
        }
    
        for (LONG i = 0; i < 2; i++)
        {
            SafeArrayPutElement(psa, &i, (void*)&(rId[i]));
        }
    
        *ppsaPrefix = psa;  
        return S_OK;  
    }  
    
  2. Реализуйте метод IRawElementProviderWindowlessSite::GetAdjacentFragment .

    Элемент управления, реализующий модель автоматизации пользовательского интерфейса, должен возвращать указатель на поставщик родительского фрагмента элемента управления.

    Чтобы вернуть родительский элемент фрагмента, объект, реализующий интерфейс IRawElementProviderFragment , должен иметь возможность реализовать метод Navigate . Реализация Navigate затруднительно для элемента управления без окон, так как элемент управления может быть не в состоянии определить свое расположение в доступном дереве родительского объекта. Метод IRawElementProviderWindowlessSite::GetAdjacentFragment позволяет элементу управления без окон запрашивать у своего сайта смежный фрагмент, а затем возвращать этот фрагмент клиенту, который называется Navigate.

    В этом примере показано, как контейнер элемента управления извлекает родительский фрагмент элемента управления без окон.

    IFACEMETHODIMP CProviderWindowlessSite::GetAdjacentFragment(
            enum NavigateDirection direction, IRawElementProviderFragment **ppFragment)   
    {
        if (ppFragment == NULL)
        {
            return E_INVALIDARG;
        }
    
        *ppFragment = NULL;
        HRESULT hr = S_OK;
    
        switch (direction)
        {
            case NavigateDirection_Parent:
                {  
                    IRawElementProviderSimple *pSimple = NULL;
    
                    // Call an application-defined function to retrieve the
                    // parent provider interface.
                    hr = GetParentProvider(&pSimple);  
                    if (SUCCEEDED(hr))  
                    {  
                        // Get the parent's IRawElementProviderFragment interface.
                        hr = pSimple->QueryInterface(IID_PPV_ARGS(ppFragment));  
                        pSimple->Release();  
                    } 
                }  
                break;  
    
            case NavigateDirection_FirstChild:
            case NavigateDirection_LastChild:
                hr = E_INVALIDARG;
                break;
    
            // Ignore NavigateDirection_NextSibling and NavigateDirection_PreviousSibling
            // because there are no adjacent fragments.
            default:  
                break;  
        }  
    
        return hr;  
    }   
    

Шаг 3. Необязательно. Реализуйте интерфейс IRawElementProviderHostingAccessibles.

Реализуйте интерфейс IRawElementProviderHostingAccessibles, если контейнер элемента управления имеет реализацию поставщика модель автоматизации пользовательского интерфейса, которая является корнем дерева специальных возможностей, включающего элементы ActiveX без окон, поддерживающие microsoft Active Accessibility. Интерфейс IRawElementProviderHostingAccessibles имеет один метод GetEmbeddedAccessibles, который извлекает указатели интерфейса IAccessible для всех элементов ActiveX без окон на основе Microsoft ActiveX, размещенных в контейнере элементов управления.

Размещение элемента управления ActiveX без окон MSAA

Специальные возможности элемента ActiveX без окон