共用方式為


支援 UI 自動化提供者的控制項模式

本主題說明 Microsoft 消費者介面自動化提供者如何實作控制項的控制項模式。 控制項模式可讓用戶端應用程式操作控制項並取得其相關資訊。

提供者會遵循下列主要步驟來實作控制項模式:

  1. 實作支援控制項模式的提供者介面。 例如,為了支援 Selection 控制項模式,自訂清單控制項的提供者會實作 ISelectionProvider 介面。
  2. 當消費者介面自動化呼叫提供者的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 自動化控制項模式概觀

消費者介面自動化提供者的操作說明主題