提供显示属性

文本服务框架 (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::RegisterCategoryMgr::RegisterCategory 的第一个参数传递的类标识符来创建显示属性提供程序的实例。 后续调用 ITfDisplayAttributeMgr::GetDisplayAttributeInfo 将重复使用显示属性提供程序对象。

    然后,TSF 管理器使用显示属性 GUID 调用 ITfDisplayAttributeProvider::GetDisplayAttributeInfo 以获取 ITfDisplayAttributeInfo 对象。

    然后,TSF 管理器将 ITfDisplayAttributeInfo 对象传回客户端。

  2. 客户端调用 ITfDisplayAttributeMgr::EnumDisplayAttributeInfo 以获取 IEnumTfDisplayAttributeInfo 对象,该对象包含所有显示属性提供程序提供的所有显示属性。 TSF 管理器枚举每个显示属性提供程序,并通过调用 CoCreateInstance 并调用作为第三个参数传递给 ITfCategoryMgr::RegisterCategory 的类标识符来创建每个提供程序的实例。

    然后,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