在 UI 自动化提供程序中支持控件模式

本主题说明 Microsoft UI 自动化 提供程序如何实现控件的控件模式。 控件模式使客户端应用程序能够操作控件并获取有关它的信息。

提供程序通过执行以下main步骤来实现控件模式:

  1. 实现支持控件模式的提供程序接口。 例如,为了支持 Selection 控件模式,自定义列表控件的提供程序将实现 ISelectionProvider 接口。
  2. 当UI 自动化调用提供程序的 IRawElementProviderSimple::GetPatternProvider 方法时,返回一个包含控件模式提供程序接口的对象。

以下示例演示自定义单选列表控件的 ISelectionProvider 接口实现。 该实现包括 IsSelectionRequired 和 CanSelectMultiple 属性的属性检索方法,以及用于检索所选列表项的提供程序的方法。

// Specifies whether the list control supports the selection of
// multiple items at the same time.
IFACEMETHODIMP ListProvider::get_CanSelectMultiple(BOOL *pRetVal)
{
    *pRetVal = FALSE;
    return S_OK;
} 

// Specifies whether the list must have an item selected at all times.
IFACEMETHODIMP ListProvider::get_IsSelectionRequired(BOOL *pRetVal)
{
   *pRetVal = TRUE;
   return S_OK;
}

// Retrieves the provider of the selected item in a custom list control. 
//
// m_pControl - pointer to an application-defined object for managing
//   the custom list control. 
//
// ListItemProvider - application-defined class that inherits the 
//   IRawElementProviderSimple interface.
//
// GetItemProviderByIndex - application-defined method that retrieves the 
//   IRawElementProviderSimple interface of the selected item.
IFACEMETHODIMP ListProvider::GetSelection(SAFEARRAY** pRetVal)
{
    // Create a safe array to store the IRawElementProviderSimple pointer.
    SAFEARRAY *psa = SafeArrayCreateVector(VT_UNKNOWN, 0, 1);

    // Retrieve the index of the selected list item. 
    int index = m_pControl->GetSelectedIndex(); 

    // Retrieve the IRawElementProviderSimple pointer of the selected list
    // item. ListItemProvider is an application-defined class that 
    // inherits the IRawElementProviderSimple interface. 
    ListItemProvider* pItem = GetItemProviderByIndex(index); 
    if (pItem != NULL)
    {
        LONG i = 0;
        SafeArrayPutElement(psa, &i, pItem);
    }
    *pRetVal = psa;
    return S_OK;
}

以下示例演示 IRawElementProviderSimple::GetPatternProvider 的实现,该实现返回实现 ISelectionProvider 的对象。 大多数列表控件也支持其他模式,但此示例返回所有其他控件模式标识符的 null 引用。

// Retrieves an object that supports the control pattern provider interface 
// for the specified control pattern. 
IFACEMETHODIMP ListProvider::GetPatternProvider(PATTERNID patternId, IUnknown** pRetVal)
{
    *pRetVal = NULL;
    if (patternId == UIA_SelectionPatternId) 
    {
        // Return the object that implements ISelectionProvider. In this example, 
        // ISelectionProvider is implemented in the current object (this).
        *pRetVal = static_cast<IRawElementProviderSimple*>(this);
        AddRef();  
    }
    return S_OK;
}

概念性

UI 自动化控件模式概述

UI 自动化提供程序的操作方法主题