Partager via


Fourniture d’attributs d’affichage

Text Services Framework (TSF) permet à un service de texte de fournir des attributs d’affichage pour le texte. Cela permet de fournir des commentaires visuels supplémentaires à l’utilisateur. Par exemple, un service de texte de vérificateur d’orthographe peut mettre en surbrillance un mot mal orthographié avec un soulignement rouge. Les attributs d’affichage fournis sont définis par la structure TF_DISPLAYATTRIBUTE et incluent la couleur du texte, la couleur d’arrière-plan du texte, le style de soulignement, la couleur de soulignement et le poids du soulignement.

Les clients qui utilisent ces informations d’attribut d’affichage sont le plus souvent des applications, mais peuvent également inclure des services de texte. Le gestionnaire TSF intermédiatise entre le fournisseur d’attributs d’affichage et le client et effectue le suivi du fournisseur d’attributs d’affichage des attributs d’affichage spécifiques.

Pour fournir des attributs d’affichage, un service de texte doit effectuer les opérations suivantes.

  1. Inscrivez le service de texte en tant que fournisseur d’attributs d’affichage en appelant ITfCategoryMgr::RegisterCategory avec l’identificateur de classe du service de texte pour le premier paramètre, GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER pour le deuxième paramètre et l’identificateur de classe du service de texte à nouveau pour le troisième paramètre.
  2. Implémentez ITfDisplayAttributeProvider et rendez-le disponible à partir de la fabrique de classes.
  3. Implémentez IEnumTfDisplayAttributeInfo et rendez-le disponible à partir de ITfDisplayAttributeProvider::EnumDisplayAttributeInfo.
  4. Implémentez un objet ITfDisplayAttributeInfo pour chaque type d’attribut d’affichage fourni par le service de texte.

Application des attributs d’affichage

Le service de texte doit appliquer l’attribut d’affichage à une plage de texte. Un service de texte peut uniquement modifier la valeur de la propriété pendant une session de modification en lecture/écriture.

En supposant qu’il s’agit d’une session de modification en lecture/écriture, un attribut d’affichage est appliqué de la manière suivante.

  1. Obtenez un objet ITfRange qui couvre le texte auquel l’attribut d’affichage sera appliqué.
  2. Obtenez un objet ITfProperty pour les attributs de texte en appelant ITfContext::GetProperty avec GUID_PROP_ATTRIBUTE.
  3. Créez un TfGuidAtom à partir du GUID d’identificateur d’attribut d’affichage défini par le service de texte en appelant ITfCategoryMgr::RegisterGUID.
  4. Initialisez une variable VARIANT pour VT_I4 et définissez le membre lVal sur tfGuidAtom créé à l’étape précédente.
  5. Appliquez l’attribut d’affichage à la plage en appelant ITfProperty::SetValue avec le cookie de modification en lecture/écriture, la plage et le VARIANT initialisés à l’étape précédente.
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;
}

Fourniture de l’objet Display Attribute Information

Un client obtient un objet ITfDisplayAttributeInfo de l’une des deux manières suivantes.

  1. Le client appelle ITfDisplayAttributeMgr::GetDisplayAttributeInfo avec l’identificateur GUID de l’attribut d’affichage. La première fois que le client appelle ITfDisplayAttributeMgr::GetDisplayAttributeInfo, le gestionnaire TSF crée une instance du fournisseur d’attributs d’affichage en appelant CoCreateInstance avec l’identificateur de classe passé comme premier paramètre à ITfCategoryMgr::RegisterCategory. Les appels suivants à ITfDisplayAttributeMgr::GetDisplayAttributeInfo réutiliseront l’objet fournisseur d’attributs d’affichage.

    Le gestionnaire TSF appelle ensuite ITfDisplayAttributeProvider::GetDisplayAttributeInfo avec le GUID d’attribut d’affichage pour obtenir l’objet ITfDisplayAttributeInfo.

    Le gestionnaire TSF transmet ensuite l’objet ITfDisplayAttributeInfo au client.

  2. Le client appelle ITfDisplayAttributeMgr::EnumDisplayAttributeInfo pour obtenir un objet IEnumTfDisplayAttributeInfo qui contient tous les attributs d’affichage fournis par tous les fournisseurs d’attributs d’affichage. Le gestionnaire TSF énumère chaque fournisseur d’attributs d’affichage et crée une instance de chaque fournisseur en appelant CoCreateInstance avec l’identificateur de classe passé comme troisième paramètre à ITfCategoryMgr::RegisterCategory.

    Le gestionnaire TSF appelle ensuite le ITfDisplayAttributeProvider::EnumDisplayAttributeInfo de chaque fournisseur pour obtenir un objet IEnumTfDisplayAttributeInfo qui contient tous les attributs d’affichage fournis par le fournisseur.

    Le gestionnaire TSF appelle ensuite la méthode IEnumTfDisplayAttributeInfo::Next du fournisseur, en ajoutant chaque objet ITfDisplayAttributeInfo obtenu au propre énumérateur du gestionnaire, jusqu’à ce que la fin de l’énumération du fournisseur soit atteinte.

    Lorsque tous les objets ITfDisplayAttributeInfo de tous les fournisseurs d’attributs d’affichage sont ajoutés à l’énumérateur du gestionnaire TSF, le gestionnaire retourne son énumérateur au client. Le client appelle ensuite IEnumTfDisplayAttributeInfo::Next une ou plusieurs fois pour obtenir les objets 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