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


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

Text Services Framework (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 на основе идентификатора идентификатора отображения, определяемого службой, путем вызова 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