提供顯示內容
Text Services Framework (TSF) 可讓文字服務提供文字的顯示內容。 這可讓使用者提供額外的視覺意見反應。 例如,拼字檢查程式文字服務可以反白顯示拼字錯誤的文字,並加上紅色底線。 提供的顯示內容是由 TF_DISPLAYATTRIBUTE 結構所定義,並包含文字色彩、文字背景色彩、底線樣式、底線色彩和底線粗細。
使用此顯示內容資訊的用戶端通常會是應用程式,但也可以包含文字服務。 TSF 管理員會在顯示內容提供者與用戶端之間協調,並追蹤特定顯示內容的顯示內容提供者。
若要提供顯示內容,文字服務必須執行下列動作。
- 藉由呼叫 ITfCategoryMgr::RegisterCategory 與第一個參數之文字服務的類別識別碼,將文字服務註冊為顯示內容提供者,針對第二個參數GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER,第三個參數再次呼叫文字服務的類別識別碼。
- 實作 ITfDisplayAttributeProvider ,並使其可從類別處理站取得。
- 實作 IEnumTfDisplayAttributeInfo ,並從 ITfDisplayAttributeProvider::EnumDisplayAttributeInfo取得。
- 針對文字服務提供的每個顯示內容類型,實作 ITfDisplayAttributeInfo 物件。
套用顯示內容
文字服務必須將顯示內容套用至文字範圍。 文字服務只能在讀取/寫入編輯會話期間修改屬性值。
假設這是在讀取/寫入編輯會話內,則會以下列方式套用顯示內容。
- 取得 ITfRange 物件,該物件涵蓋將套用顯示內容的文字。
- 使用 GUID_PROP_ATTRIBUTE 呼叫ITfCoNtext::GetProperty,以取得文字屬性的ITfProperty物件。
- 藉由呼叫ITfCategoryMgr::RegisterGUID,從文字服務定義的顯示內容識別碼GUID建立TfGuidAtom。
- 初始化 VARIANT 變數以VT_I4,並將 lVal 成員設定為在上一個步驟中建立的 TfGuidAtom 。
- 使用讀取/寫入編輯 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 物件。
用戶端會使用顯示內容的GUID識別碼呼叫ITfDisplayAttributeMgr::GetDisplayAttributeInfo。 第一次用戶端呼叫 ITfDisplayAttributeMgr::GetDisplayAttributeInfo時,TSF 管理員會呼叫 CoCreateInstance,並將第一個參數傳遞為 ITfCategoryMgr::RegisterCategory 的類別識別碼來建立顯示內容提供者的實例。 後續對 ITfDisplayAttributeMgr::GetDisplayAttributeInfo 的呼叫將會重複使用顯示內容提供者物件。
TSF 管理員接著會使用顯示內容GUID呼叫ITfDisplayAttributeProvider::GetDisplayAttributeInfo,以取得ITfDisplayAttributeInfo物件。
TSF 管理員接著會將 ITfDisplayAttributeInfo 物件傳回用戶端。
用戶端會呼叫 ITfDisplayAttributeMgr::EnumDisplayAttributeInfo ,以取得 IEnumTfDisplayAttributeInfo 物件,其中包含所有顯示內容提供者所提供的所有顯示內容。 TSF 管理員會列舉每個顯示內容提供者,並使用傳遞為 ITfCategoryMgr::RegisterCategory的類別識別碼呼叫 CoCreateInstance 來建立每個提供者的實例。
TSF 管理員接著會呼叫每個提供者的 ITfDisplayAttributeProvider::EnumDisplayAttributeInfo ,以取得 IEnumTfDisplayAttributeInfo 物件,其中包含提供者提供的所有顯示內容。
TSF 管理員接著會呼叫提供者的 IEnumTfDisplayAttributeInfo::Next 方法,將每個 ITfDisplayAttributeInfo 物件新增至管理員自己的列舉值,直到到達提供者列舉的結尾為止。
當所有顯示內容提供者的所有 ITfDisplayAttributeInfo 物件都新增至 TSF 管理員的列舉值時,管理員會將其列舉值傳回用戶端。 用戶端接著會呼叫 IEnumTfDisplayAttributeInfo::Next 一或多次,以取得 ITfDisplayAttributeInfo 物件。
相關主題
-
IEnumTfDisplayAttributeInfo
-
ITfDisplayAttributeProvider::EnumDisplayAttributeInfo