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