Поделиться через


Предоставление атрибутов отображения

Платформа текстовых служб (TSF) позволяет текстовой службе предоставлять атрибуты отображения текста. Это позволяет предоставлять пользователю дополнительные визуальные отзывы. Например, служба проверки правописания может выделить неправильное слово с красным подчеркиванием. Предоставленные атрибуты отображения определяются структурой TF_DISPLAYATTRIBUTE и включают цвет текста, цвет фона текста, стиль подчеркивания, цвет подчеркивания и вес подчеркивания.

Клиенты, использующие эту информацию атрибута отображения, чаще всего будут приложениями, но также могут включать текстовые службы. Диспетчер TSF осуществляет посредничество между поставщиком атрибутов отображения и клиентом и отслеживает поставщиков определенных атрибутов отображения.

Для предоставления атрибутов отображения текстовые службы должны выполнять следующие действия.

  1. Зарегистрируйте текстовую службу в качестве поставщика атрибутов отображения, вызвав ITfCategoryMgr::RegisterCategory с идентификатором класса текстовой службы для первого параметра, GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER для второго параметра и идентификатора класса текстовой службы еще раз для третьего параметра.
  2. Реализуйте ITfDisplayAttributeProvider и сделайте его доступным через фабрику классов.
  3. Реализуйте IEnumTfDisplayAttributeInfo и сделайте его доступным через ITfDisplayAttributeProvider::EnumDisplayAttributeInfo.
  4. Реализуйте объект ITfDisplayAttributeInfo для каждого типа атрибута отображения, который предоставляет служба текста.

Применение атрибутов отображения

Служба текста должна применять атрибут отображения к диапазону текста. Текстовая служба может изменять значение свойства только во время сеанса редактирования чтения и записи.

Если это происходит в сеансе редактирования чтения и записи, атрибут отображения применяется следующим образом.

  1. Получите объект ITfRange, охватывающий текст, к которому будет применен атрибут отображения.
  2. Получите объект ITfProperty для текстовых атрибутов путем вызова ITfContext::GetProperty с GUID_PROP_ATTRIBUTE.
  3. Создайте TfGuidAtom из идентификатора атрибута отображения, определенного в текстовой службе GUID, путем вызова ITfCategoryMgr::RegisterGUID.
  4. Инициализируйте переменную VARIANT как VT_I4 и установите член lVal в значение TfGuidAtom , созданное на предыдущем шаге.
  5. Примените атрибут отображения к диапазону путем вызова ITfProperty::SetValue с файлом cookie редактирования чтения и записи, диапазона и 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. Клиент вызывает ITfDisplayAttributeMgr::GetDisplayAttributeInfo с идентификатором GUID атрибута отображения. При первом вызове клиента ITfDisplayAttributeMgr::GetDisplayAttributeInfoдиспетчер TSF создаст экземпляр поставщика атрибутов отображения путем вызова CoCreateInstance с идентификатором класса, переданным в качестве первого параметра для ITfCategoryMgr::RegisterCategory. Последующие вызовы ITfDisplayAttributeMgr::GetDisplayAttributeInfo повторно используют объект поставщика атрибутов отображения.

    Затем диспетчер TSF вызывает ITfDisplayAttributeProvider::GetDisplayAttributeInfo с атрибутом отображения GUID, чтобы получить объект 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