提供顯示內容

Text Services Framework (TSF) 可讓文字服務提供文字的顯示內容。 這可讓使用者提供額外的視覺意見反應。 例如,拼字檢查程式文字服務可以反白顯示拼字錯誤的文字,並加上紅色底線。 提供的顯示內容是由 TF_DISPLAYATTRIBUTE 結構所定義,並包含文字色彩、文字背景色彩、底線樣式、底線色彩和底線粗細。

使用此顯示內容資訊的用戶端通常會是應用程式,但也可以包含文字服務。 TSF 管理員會在顯示內容提供者與用戶端之間協調,並追蹤特定顯示內容的顯示內容提供者。

若要提供顯示內容,文字服務必須執行下列動作。

  1. 藉由呼叫 ITfCategoryMgr::RegisterCategory 與第一個參數之文字服務的類別識別碼,將文字服務註冊為顯示內容提供者,針對第二個參數GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER,第三個參數再次呼叫文字服務的類別識別碼。
  2. 實作 ITfDisplayAttributeProvider ,並使其可從類別處理站取得。
  3. 實作 IEnumTfDisplayAttributeInfo ,並從 ITfDisplayAttributeProvider::EnumDisplayAttributeInfo取得。
  4. 針對文字服務提供的每個顯示內容類型,實作 ITfDisplayAttributeInfo 物件。

套用顯示內容

文字服務必須將顯示內容套用至文字範圍。 文字服務只能在讀取/寫入編輯會話期間修改屬性值。

假設這是在讀取/寫入編輯會話內,則會以下列方式套用顯示內容。

  1. 取得 ITfRange 物件,該物件涵蓋將套用顯示內容的文字。
  2. 使用 GUID_PROP_ATTRIBUTE 呼叫ITfCoNtext::GetProperty,以取得文字屬性的ITfProperty物件。
  3. 藉由呼叫ITfCategoryMgr::RegisterGUID,從文字服務定義的顯示內容識別碼GUID建立TfGuidAtom
  4. 初始化 VARIANT 變數以VT_I4,並將 lVal 成員設定為在上一個步驟中建立的 TfGuidAtom
  5. 使用讀取/寫入編輯 Cookie 呼叫 ITfProperty::SetValue 、在上一個步驟中初始化的範圍和 VARIANT,以將顯示內容套用至範圍。
STDAPI CEditSession::DoEditSession(TfEditCookie ec)
{
    HRESULT hr;
    ITfCategoryMgr *pCategoryMgr;
    TfGuidAtom  gaDisplayAttribute = TF_INVALID_GUIDATOM;

    //Create a TfGuidAtom for the display attribute identifier. 
    hr = CoCreateInstance(CLSID_TF_CategoryMgr,
                         NULL, 
                         CLSCTX_INPROC_SERVER, 
                         IID_ITfCategoryMgr, 
                         (void**)&pCategoryMgr);
    
    if(SUCCEEDED(hr))
    {
        hr = pCategoryMgr->RegisterGUID(guidDisplayAttribute, &gaDisplayAttribute);

        pCategoryMgr->Release();
    }
    
    //Apply the display attribute to the selected text. 
    if(TF_INVALID_GUIDATOM != gaDisplayAttribute)
    {
        TF_SELECTION tfSel;
        ULONG cFetched;

        //Get the selection. 
        hr = m_pContext->GetSelection(ec, TF_DEFAULT_SELECTION, 1, &tfSel, &cFetched);
        if(SUCCEEDED(hr) && cFetched)
        {
            ITfProperty *pDisplayAttributeProperty;

            //Get the display attribute property. 
            hr = m_pContext->GetProperty(GUID_PROP_ATTRIBUTE, &pDisplayAttributeProperty);
            if(SUCCEEDED(hr))
            {
                VARIANT var;

                VariantInit(&var);

                //All display attributes are TfGuidAtoms and TfGuidAtoms are VT_I4. 
                var.vt = VT_I4; 
                var.lVal = gaDisplayAttribute;

                //Set the display attribute value over the range. 
                hr = pDisplayAttributeProperty->SetValue(ec, tfSel.range, &var);

                pDisplayAttributeProperty->Release();
            }

            tfSel.range->Release();
        }
    }

    return S_OK;
}

提供顯示內容資訊物件

用戶端會以兩種方式之一取得 ITfDisplayAttributeInfo 物件。

  1. 用戶端會使用顯示內容的GUID識別碼呼叫ITfDisplayAttributeMgr::GetDisplayAttributeInfo。 第一次用戶端呼叫 ITfDisplayAttributeMgr::GetDisplayAttributeInfo時,TSF 管理員會呼叫 CoCreateInstance,並將第一個參數傳遞為 ITfCategoryMgr::RegisterCategory 的類別識別碼來建立顯示內容提供者的實例。 後續對 ITfDisplayAttributeMgr::GetDisplayAttributeInfo 的呼叫將會重複使用顯示內容提供者物件。

    TSF 管理員接著會使用顯示內容GUID呼叫ITfDisplayAttributeProvider::GetDisplayAttributeInfo,以取得ITfDisplayAttributeInfo物件。

    TSF 管理員接著會將 ITfDisplayAttributeInfo 物件傳回用戶端。

  2. 用戶端會呼叫 ITfDisplayAttributeMgr::EnumDisplayAttributeInfo ,以取得 IEnumTfDisplayAttributeInfo 物件,其中包含所有顯示內容提供者所提供的所有顯示內容。 TSF 管理員會列舉每個顯示內容提供者,並使用傳遞為 ITfCategoryMgr::RegisterCategory的類別識別碼呼叫 CoCreateInstance 來建立每個提供者的實例。

    TSF 管理員接著會呼叫每個提供者的 ITfDisplayAttributeProvider::EnumDisplayAttributeInfo ,以取得 IEnumTfDisplayAttributeInfo 物件,其中包含提供者提供的所有顯示內容。

    TSF 管理員接著會呼叫提供者的 IEnumTfDisplayAttributeInfo::Next 方法,將每個 ITfDisplayAttributeInfo 物件新增至管理員自己的列舉值,直到到達提供者列舉的結尾為止。

    當所有顯示內容提供者的所有 ITfDisplayAttributeInfo 物件都新增至 TSF 管理員的列舉值時,管理員會將其列舉值傳回用戶端。 用戶端接著會呼叫 IEnumTfDisplayAttributeInfo::Next 一或多次,以取得 ITfDisplayAttributeInfo 物件。

TF_DISPLAYATTRIBUTE

ITfCategoryMgr::RegisterCategory

ITfDisplayAttributeProvider

IEnumTfDisplayAttributeInfo

ITfDisplayAttributeProvider::EnumDisplayAttributeInfo

ITfDisplayAttributeInfo

ITfRange

ITfProperty

ITfCoNtext::GetProperty

TfGuidAtom

ITfCategoryMgr::RegisterGUID

ITfProperty::SetValue

ITfDisplayAttributeMgr::GetDisplayAttributeInfo

ITfDisplayAttributeProvider::GetDisplayAttributeInfo

ITfDisplayAttributeMgr::EnumDisplayAttributeInfo

IEnumTfDisplayAttributeInfo

ITfDisplayAttributeProvider::EnumDisplayAttributeInfo

IEnumTfDisplayAttributeInfo::Next