Fornire attributi di visualizzazione
Text Services Framework (TSF) consente a un servizio di testo di fornire attributi di visualizzazione per il testo. In questo modo è possibile fornire all'utente un feedback visivo aggiuntivo. Ad esempio, un correttore ortografico può evidenziare una parola errata con una sottolineatura rossa. Gli attributi di visualizzazione forniti sono definiti dalla struttura TF_DISPLAYATTRIBUTE e includono il colore del testo, il colore di sfondo del testo, lo stile sottolineato, il colore sottolineato e lo spessore della sottolineatura.
I client che usano queste informazioni sull'attributo di visualizzazione sono spesso applicazioni, ma possono includere anche servizi di testo. Il gestore TSF media tra il provider di attributi di visualizzazione e il client e tiene traccia di quest’ultimo per quanto riguarda gli attributi di visualizzazione specifici.
Per fornire attributi di visualizzazione, un servizio di testo deve eseguire le operazioni seguenti.
- Registrare il servizio di testo come provider di attributi di visualizzazione chiamando ITfCategoryMgr::RegisterCategory con l'identificatore di classe del servizio di testo per il primo parametro, GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER per il secondo parametro e l'identificatore di classe del servizio di testo per il terzo parametro.
- Implementare ITfDisplayAttributeProvider e renderlo disponibile dalla class factory.
- Implementare IEnumTfDisplayAttributeInfo e renderlo disponibile da ITfDisplayAttributeProvider::EnumDisplayAttributeInfo.
- Implementare un oggetto ITfDisplayAttributeInfo per ogni tipo di attributo visualizzato fornito dal servizio di testo.
Applicazione degli attributi di visualizzazione
Il servizio di testo deve applicare l'attributo di visualizzazione a un intervallo di testo. Un servizio di testo può modificare il valore della proprietà solo durante una sessione di modifica di scrittura/lettura.
Supponendo che si tratta di una sessione di modifica di lettura/scrittura, viene applicato un attributo di visualizzazione nel modo seguente.
- Ottenere un oggetto ITfRange che copre il testo a cui verrà applicato l'attributo di visualizzazione.
- Ottenere un oggetto ITfProperty per gli attributi di testo chiamando ITfContext::GetProperty con GUID_PROP_ATTRIBUTE.
- Creare un TfGuidAtom dall'identificatore dell'attributo di visualizzazione definito dal servizio testo GUID invocando ITfCategoryMgr::RegisterGUID.
- Inizializzare una variabile VARIANT a VT_I4 e impostare il membro lVal sul TfGuidAtom creato nel passaggio precedente.
- Applicare l'attributo di visualizzazione all'intervallo chiamando ITfProperty::SetValue utilizzando il cookie di modifica lettura/scrittura, l'intervallo e l'oggetto VARIANT inizializzato nel passaggio precedente.
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;
}
Fornitura dell'oggetto Informazioni sugli attributi di visualizzazione
Un client ottiene un oggetto ITfDisplayAttributeInfo in due modi.
Il client chiama ITfDisplayAttributeMgr::GetDisplayAttributeInfo con l'identificatore GUID dell'attributo di visualizzazione. La prima volta che il client chiama ITfDisplayAttributeMgr::GetDisplayAttributeInfo, il gestore TSF creerà un'istanza del provider di attributi di visualizzazione chiamando CoCreateInstance con l'identificatore di classe passato come primo parametro a ITfCategoryMgr::RegisterCategory. Le chiamate successive a ITfDisplayAttributeMgr::GetDisplayAttributeInfo riutilizzeranno l'oggetto del provider dell'attributo di visualizzazione.
Il gestore TSF chiama quindi ITfDisplayAttributeProvider::GetDisplayAttributeInfo con l'attributo di visualizzazione GUID per ottenere l'oggetto ITfDisplayAttributeInfo.
Il gestore TSF passa quindi l'oggetto ITfDisplayAttributeInfo al client.
Il client chiama ITfDisplayAttributeMgr::EnumDisplayAttributeInfo per ottenere un oggetto IEnumTfDisplayAttributeInfo che contiene tutti gli attributi di visualizzazione forniti da tutti i provider di attributi di visualizzazione. Il gestore TSF enumera ogni provider di attributi di visualizzazione e crea un'istanza di ogni provider chiamando CoCreateInstance con l'identificatore di classe passato come terzo parametro a ITfCategoryMgr::RegisterCategory.
Il gestore TSF chiama quindi ITfDisplayAttributeProvider::EnumDisplayAttributeInfo per ottenere un IEnumTfDisplayAttributeInfo oggetto che contiene tutti gli attributi di visualizzazione forniti dal provider.
Il gestore TSF chiama quindi il metodo IEnumTfDisplayAttributeInfo::Next, aggiungendo ogni oggetto ITfDisplayAttributeInfo ottenuto all'enumeratore del gestore, fino alla fine dell'enumerazione del fornitore.
Quando tutti gli oggetti ITfDisplayAttributeInfo per tutti i provider di attributi di visualizzazione vengono aggiunti all'enumeratore del gestore TSF, il gestore restituisce l'enumeratore al client. Il client chiama quindi IEnumTfDisplayAttributeInfo::Next una o più volte per ottenere gli oggetti ITfDisplayAttributeInfo.
Argomenti correlati
-
IEnumTfDisplayAttributeInfo
-
ITfDisplayAttributeProvider::EnumDisplayAttributeInfo