Freigeben über


Bereitstellen von Anzeigeattributen

Text Services Framework (TSF) ermöglicht es einem Textdienst, Anzeigeattribute für Text bereitzustellen. Dadurch kann dem Benutzer zusätzliches visuelles Feedback zur Verfügung gestellt werden. Beispielsweise kann ein Textdienst für die Rechtschreibprüfung ein falsch geschriebenes Wort mit einer roten Unterstreichung hervorheben. Die bereitgestellten Anzeigeattribute werden durch die TF_DISPLAYATTRIBUTE-Struktur definiert und umfassen Textfarbe, Texthintergrundfarbe, Unterstreichungsstil, Unterstrichfarbe und Unterstreichungsstärke.

Clients, die diese Anzeigeattributeinformationen verwenden, sind in den meisten Fällen Anwendungen, können aber auch Textdienste enthalten. Der TSF-Manager vermittelt zwischen dem Anzeigeattributeanbieter und dem Client und verfolgt den Anzeigeattributeanbieter der spezifischen Anzeigeattribute nach.

Um Anzeigeattribute bereitzustellen, muss ein Textdienst die folgenden Schritte ausführen.

  1. Registrieren Sie den Textdienst als Anzeigeattributanbieter, indem Sie ITfCategoryMgr::RegisterCategory mit dem Klassenbezeichner des Textdiensts für den ersten Parameter aufrufen, GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER für den zweiten Parameter und den Klassenbezeichner des Textdiensts erneut für den dritten Parameter.
  2. Implementieren Sie ITfDisplayAttributeProvider , und stellen Sie ihn über die Klassenfactory zur Verfügung.
  3. Implementieren Sie IEnumTfDisplayAttributeInfo , und stellen Sie es über ITfDisplayAttributeProvider::EnumDisplayAttributeInfo zur Verfügung.
  4. Implementieren Sie ein ITfDisplayAttributeInfo-Objekt für jeden Typ von Anzeigeattribut, den der Textdienst bereitstellt.

Anwenden der Anzeigeattribute

Der Textdienst muss das display-Attribut auf einen Textbereich anwenden. Ein Textdienst kann den Eigenschaftswert nur während einer Bearbeitungssitzung mit Lese-/Schreibzugriff ändern.

Wenn dies innerhalb einer Lese-/Schreib-Bearbeitungssitzung liegt, wird ein anzeige-Attribut wie folgt angewendet.

  1. Rufen Sie ein ITfRange-Objekt ab, das den Text abdeckt, auf den das display-Attribut angewendet wird.
  2. Rufen Sie ein ITfProperty-Objekt für die Textattribute ab, indem Sie ITfContext::GetProperty mit GUID_PROP_ATTRIBUTE aufrufen.
  3. Erstellen Sie ein TfGuidAtom aus der vom Textdienst definierten Anzeigeattribut-GUID, indem Sie ITfCategoryMgr::RegisterGUID aufrufen.
  4. Initialisieren Sie eine VARIANT-Variable, um VT_I4, und legen Sie den lVal-Member auf das tfGuidAtom fest, das im vorherigen Schritt erstellt wurde.
  5. Wenden Sie das display-Attribut auf den Bereich an, indem Sie ITfProperty::SetValue mit dem Lese-/Schreib-Bearbeitungscookie, dem Bereich und dem im vorherigen Schritt initialisierten VARIANT aufrufen.
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;
}

Bereitstellen des Attributinformationsobjekts anzeigen

Ein Client ruft ein ITfDisplayAttributeInfo-Objekt auf zwei Arten ab.

  1. Der Client ruft ITfDisplayAttributeMgr::GetDisplayAttributeInfo mit dem GUID-Bezeichner des display-Attributs auf. Wenn der Client ITfDisplayAttributeMgr::GetDisplayAttributeInfo zum ersten Mal aufruft, erstellt der TSF-Manager eine instance des Anzeigeattributanbieters, indem CoCreateInstance mit dem Klassenbezeichner aufgerufen wird, der als erster Parameter an ITfCategoryMgr::RegisterCategory übergeben wird. Nachfolgende Aufrufe von ITfDisplayAttributeMgr::GetDisplayAttributeInfo werden das Objekt des Anzeigeattributanbieters wiederverwendet.

    Der TSF-Manager ruft dann ITfDisplayAttributeProvider::GetDisplayAttributeInfo mit der display-Attribut-GUID auf, um das ITfDisplayAttributeInfo-Objekt abzurufen.

    Der TSF-Manager übergibt dann das ITfDisplayAttributeInfo-Objekt zurück an den Client.

  2. Der Client ruft ITfDisplayAttributeMgr::EnumDisplayAttributeInfo auf, um ein IEnumTfDisplayAttributeInfo-Objekt abzurufen, das alle Anzeigeattribute enthält, die von allen Anzeigeattributanbietern bereitgestellt werden. Der TSF-Manager listet jeden Anzeigeattributanbieter auf und erstellt eine instance jedes Anbieters durch Aufrufen von CoCreateInstance mit dem Klassenbezeichner, der als dritter Parameter an ITfCategoryMgr::RegisterCategory übergeben wird.

    Der TSF-Manager ruft dann ITfDisplayAttributeProvider::EnumDisplayAttributeInfo jedes Anbieters auf, um ein IEnumTfDisplayAttributeInfo-Objekt abzurufen, das alle vom Anbieter bereitgestellten Anzeigeattribute enthält.

    Der TSF-Manager ruft dann die IEnumTfDisplayAttributeInfo::Next-Methode des Anbieters auf und fügt jedes abgerufene ITfDisplayAttributeInfo-Objekt dem eigenen Enumerator des Vorgesetzten hinzu, bis das Ende der Enumeration des Anbieters erreicht ist.

    Wenn alle ITfDisplayAttributeInfo-Objekte für alle Anzeigeattributanbieter dem Enumerator des TSF-Managers hinzugefügt werden, gibt der Manager seinen Enumerator an den Client zurück. Der Client ruft dann ein oder mehrmals IEnumTfDisplayAttributeInfo::Next auf, um die ITfDisplayAttributeInfo-Objekte abzurufen.

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