Proporcionar atributos para mostrar
Text Services Framework (TSF) permite que un servicio de texto proporcione atributos para mostrar para texto. Esto permite proporcionar comentarios visuales adicionales al usuario. Por ejemplo, un servicio de texto de corrector ortográfico puede resaltar una palabra mal escrita con un subrayado rojo. Los atributos para mostrar proporcionados se definen mediante la estructura TF_DISPLAYATTRIBUTE e incluyen el color del texto, el color de fondo del texto, el estilo de subrayado, el color de subrayado y el grosor del subrayado.
Los clientes que usan esta información de atributo para mostrar suelen ser aplicaciones, pero también pueden incluir servicios de texto. El administrador de TSF media entre el proveedor de atributos para mostrar y el cliente y realiza un seguimiento del proveedor de atributos para mostrar de los atributos de visualización específicos.
Para proporcionar atributos para mostrar, un servicio de texto debe hacer lo siguiente.
- Registre el servicio de texto como proveedor de atributos para mostrar llamando a ITfCategoryMgr::RegisterCategory con el identificador de clase del servicio de texto para el primer parámetro, GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER para el segundo parámetro y el identificador de clase del servicio de texto de nuevo para el tercer parámetro.
- Implemente ITfDisplayAttributeProvider y haga que esté disponible en el generador de clases.
- Implemente IEnumTfDisplayAttributeInfo y haga que esté disponible en ITfDisplayAttributeProvider::EnumDisplayAttributeInfo.
- Implemente un objeto ITfDisplayAttributeInfo para cada tipo de atributo para mostrar que proporciona el servicio de texto.
Aplicación de los atributos de presentación
El servicio de texto debe aplicar el atributo display a un intervalo de texto. Un servicio de texto solo puede modificar el valor de propiedad durante una sesión de edición de lectura y escritura.
Suponiendo que se encuentra dentro de una sesión de edición de lectura y escritura, se aplica un atributo para mostrar de la siguiente manera.
- Obtenga un objeto ITfRange que cubra el texto al que se aplicará el atributo display.
- Obtenga un objeto ITfProperty para los atributos de texto llamando a ITfContext::GetProperty con GUID_PROP_ATTRIBUTE.
- Cree un TfGuidAtom a partir del GUID de atributo de visualización definido por el servicio de texto llamando a ITfCategoryMgr::RegisterGUID.
- Inicialice una variable VARIANT para VT_I4 y establezca el miembro lVal en tfGuidAtom creado en el paso anterior.
- Aplique el atributo display al intervalo llamando a ITfProperty::SetValue con la cookie de edición de lectura y escritura, el intervalo y la VARIANTE inicializadas en el paso anterior.
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;
}
Proporcionar el objeto de información de atributo para mostrar
Un cliente obtiene un objeto ITfDisplayAttributeInfo de dos maneras.
El cliente llama a ITfDisplayAttributeMgr::GetDisplayAttributeInfo con el identificador GUID del atributo display. La primera vez que el cliente llama a ITfDisplayAttributeMgr::GetDisplayAttributeInfo, el administrador de TSF creará una instancia del proveedor de atributos para mostrar llamando a CoCreateInstance con el identificador de clase pasado como primer parámetro a ITfCategoryMgr::RegisterCategory. Las llamadas posteriores a ITfDisplayAttributeMgr::GetDisplayAttributeInfo reutilizarán el objeto de proveedor de atributos para mostrar.
A continuación, el administrador de TSF llama a ITfDisplayAttributeProvider::GetDisplayAttributeInfo con el GUID del atributo para mostrar para obtener el objeto ITfDisplayAttributeInfo .
A continuación, el administrador de TSF pasa el objeto ITfDisplayAttributeInfo al cliente.
El cliente llama a ITfDisplayAttributeMgr::EnumDisplayAttributeInfo para obtener un objeto IEnumTfDisplayAttributeInfo que contiene todos los atributos para mostrar proporcionados por todos los proveedores de atributos para mostrar. El administrador de TSF enumera cada proveedor de atributos para mostrar y crea una instancia de cada proveedor llamando a CoCreateInstance con el identificador de clase pasado como tercer parámetro a ITfCategoryMgr::RegisterCategory.
A continuación, el administrador de TSF llama a ITfDisplayAttributeProvider::EnumDisplayAttributeInfo de cada proveedor para obtener un objeto IEnumTfDisplayAttributeInfo que contiene todos los atributos para mostrar proporcionados por el proveedor.
A continuación, el administrador de TSF llama al método IEnumTfDisplayAttributeInfo::Next del proveedor, agregando cada objeto ITfDisplayAttributeInfo obtenido al enumerador propio del administrador, hasta que se alcanza el final de la enumeración del proveedor.
Cuando todos los objetos ITfDisplayAttributeInfo para todos los proveedores de atributos para mostrar se agregan al enumerador del administrador de TSF, el administrador devuelve su enumerador al cliente. A continuación, el cliente llama a IEnumTfDisplayAttributeInfo::Next una o varias veces para obtener los objetos ITfDisplayAttributeInfo .
Temas relacionados
-
IEnumTfDisplayAttributeInfo
-
ITfDisplayAttributeProvider::EnumDisplayAttributeInfo