Предоставление атрибутов отображения
Text Services Framework (TSF) позволяет службе текста предоставлять атрибуты отображения текста. Это позволяет предоставлять пользователю дополнительные визуальные отзывы. Например, служба проверки орфографии может выделять слово с ошибками с красным подчеркиванием. Предоставляемые атрибуты отображения определяются структурой TF_DISPLAYATTRIBUTE и включают цвет текста, цвет фона текста, стиль подчеркивания, цвет подчеркивания и вес подчеркивания.
Клиенты, использующие эти сведения об атрибуте отображения, чаще всего являются приложениями, но могут также включать текстовые службы. Диспетчер TSF выполняет посредник между поставщиком атрибутов отображения и клиентом и отслеживает поставщик атрибутов отображения конкретных атрибутов отображения.
Чтобы предоставить атрибуты отображения, служба текста должна выполнить следующие действия.
- Зарегистрируйте текстовую службу в качестве поставщика атрибутов отображения, вызвав ITfCategoryMgr::RegisterCategory с идентификатором класса текстовой службы для первого параметра, GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER для второго параметра и идентификатором класса текстовой службы еще раз для третьего параметра.
- Реализуйте ITfDisplayAttributeProvider и сделайте его доступным из фабрики классов.
- Реализуйте IEnumTfDisplayAttributeInfo и сделайте его доступным из ITfDisplayAttributeProvider::EnumDisplayAttributeInfo.
- Реализуйте объект ITfDisplayAttributeInfo для каждого типа атрибута отображения, который предоставляет служба текста.
Применение атрибутов отображения
Служба текста должна применять атрибут отображения к диапазону текста. Текстовая служба может изменять значение свойства только во время сеанса редактирования чтения и записи.
При условии, что это происходит в рамках сеанса редактирования чтения и записи, атрибут отображения применяется следующим образом.
- Получите объект ITfRange , охватывающий текст, к которому будет применяться атрибут отображения.
- Получите объект ITfProperty для текстовых атрибутов, вызвав метод ITfContext::GetProperty с GUID_PROP_ATTRIBUTE.
- Создайте TfGuidAtom на основе идентификатора идентификатора отображения, определяемого службой, путем вызова ITfCategoryMgr::RegisterGUID.
- Инициализируйте переменную VARIANT для VT_I4 и задайте для члена lValзначение TfGuidAtom, созданное на предыдущем шаге.
- Примените атрибут отображения к диапазону, вызвав 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 одним из двух способов.
Клиент вызывает ITfDisplayAttributeMgr::GetDisplayAttributeInfo с идентификатором GUID атрибута отображения. При первом вызове клиентом ITfDisplayAttributeMgr::GetDisplayAttributeInfo диспетчер TSF создаст экземпляр поставщика атрибутов отображения, вызвав CoCreateInstance с идентификатором класса, переданным в качестве первого параметра В ITfCategoryMgr::RegisterCategory. Последующие вызовы ITfDisplayAttributeMgr::GetDisplayAttributeInfo будут повторно использовать объект поставщика атрибута отображения.
Затем диспетчер TSF вызывает ITfDisplayAttributeProvider::GetDisplayAttributeInfo с идентификатором GUID атрибута отображения, чтобы получить объект ITfDisplayAttributeInfo .
Затем диспетчер TSF передает клиенту объект ITfDisplayAttributeInfo .
Клиент вызывает ITfDisplayAttributeMgr::EnumDisplayAttributeInfo , чтобы получить объект IEnumTfDisplayAttributeInfo , содержащий все атрибуты отображения, предоставляемые всеми поставщиками атрибутов отображения. Диспетчер TSF перечисляет каждый поставщик атрибутов отображения и создает экземпляр каждого поставщика, вызывая CoCreateInstance с идентификатором класса, переданным в качестве третьего параметра В ITfCategoryMgr::RegisterCategory.
Затем диспетчер TSF вызывает ITfDisplayAttributeProvider::EnumDisplayAttributeInfo каждого поставщика, чтобы получить объект IEnumTfDisplayAttributeInfo , содержащий все атрибуты отображения, предоставляемые поставщиком.
Затем диспетчер TSF вызывает метод IEnumTfDisplayAttributeInfo поставщика::Next , добавляя каждый полученный объект ITfDisplayAttributeInfo в собственный перечислитель руководителя, пока не будет достигнут конец перечисления поставщика.
Когда все объекты ITfDisplayAttributeInfo для всех поставщиков атрибутов отображения добавляются в перечислитель диспетчера TSF, диспетчер возвращает клиенту свой перечислитель. Затем клиент вызывает IEnumTfDisplayAttributeInfo::Next один или несколько раз, чтобы получить объекты ITfDisplayAttributeInfo .
Связанные темы
-
IEnumTfDisplayAttributeInfo
-
ITfDisplayAttributeProvider::EnumDisplayAttributeInfo