Condividi tramite


Fornitura di attributi di visualizzazione

Text Services Framework (TSF) consente a un servizio di testo di fornire attributi di visualizzazione per il testo. Ciò consente di fornire commenti visivi aggiuntivi all'utente. Ad esempio, un servizio di controllo ortografico può evidenziare una parola non corretta 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 di sottolineatura, il colore sottolineatura e il peso della sottolineatura.

I client che usano queste informazioni sull'attributo di visualizzazione saranno spesso applicazioni, ma possono anche includere servizi di testo. Il gestore TSF media tra il provider di attributi di visualizzazione e il client e tiene traccia del provider di attributi di visualizzazione specifici.

Per fornire attributi di visualizzazione, un servizio di testo deve eseguire le operazioni seguenti.

  1. Registrare il servizio di testo come provider di attributi visualizzati 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 di nuovo per il terzo parametro.
  2. Implementare ITfDisplayAttributeProvider e renderlo disponibile dalla class factory.
  3. Implementare IEnumTfDisplayAttributeInfo e renderlo disponibile da ITfDisplayAttributeProvider::EnumDisplayAttributeInfo.
  4. 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 solo il valore della proprietà durante una sessione di modifica di lettura/scrittura.

Supponendo che si stia all'interno di una sessione di modifica di lettura/scrittura, viene applicato un attributo di visualizzazione nel modo seguente.

  1. Ottenere un oggetto ITfRange che copre il testo a cui verrà applicato l'attributo di visualizzazione.
  2. Ottenere un oggetto ITfProperty per gli attributi di testo chiamando ITfContext::GetProperty con GUID_PROP_ATTRIBUTE.
  3. Creare un TFGuidAtom dal GUID dell'identificatore dell'attributo di visualizzazione definito dal servizio di testo chiamando ITfCategoryMgr::RegisterGUID.
  4. Inizializzare una variabile VARIANT su VT_I4 e impostare il membro lVal sul tfGuidAtom creato nel passaggio precedente.
  5. Applicare l'attributo di visualizzazione all'intervallo chiamando ITfProperty::SetValue con il cookie di modifica di lettura/scrittura, l'intervallo e l'inizializzazione VARIANT 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;
}

Specificare l'oggetto Informazioni sull'attributo display

Un client ottiene un oggetto ITfDisplayAttributeInfo in uno dei due modi.

  1. 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 visualizzati chiamando CoCreateInstance con l'identificatore di classe passato come primo parametro a ITfCategoryMgr::RegisterCategory. Le chiamate successive a ITfDisplayAttributeMgr::GetDisplayAttributeInfo ririuseranno l'oggetto provider di attributi visualizzati.

    Il gestore TSF chiama quindi ITfDisplayAttributeProvider::GetDisplayAttributeInfo con il GUID dell'attributo display per ottenere l'oggetto ITfDisplayAttributeInfo .

    Il gestore TSF passa quindi l'oggetto ITfDisplayAttributeInfo al client.

  2. Il client chiama ITfDisplayAttributeMgr::EnumDisplayAttributeInfo per ottenere un oggetto IEnumTfDisplayAttributeInfo contenente tutti gli attributi visualizzati 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 di ogni provider::EnumDisplayAttributeInfo per ottenere un oggetto IEnumTfDisplayAttributeInfo che contiene tutti gli attributi di visualizzazione forniti dal provider.

    Il gestore TSF chiama quindi il metodo IEnumTfDisplayAttributeInfo::Next aggiungendo ogni oggetto ITfDisplayAttributeInfo ottenuto al proprio enumeratore del gestore, fino al raggiungimento della fine dell'enumerazione del provider.

    Quando tutti gli oggetti ITfDisplayAttributeInfo per tutti i provider di attributi visualizzati vengono aggiunti all'enumeratore di gestione TSF, il gestore restituisce il relativo enumeratore al client. Il client chiama quindi IEnumTfDisplayAttributeInfo::Next una o più volte per ottenere gli oggetti 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