Bereitstellen von Anzeigeattributen
Textdienstframework (TSF) ermöglicht einem Textdienst das Bereitstellen von Anzeigeattributen für Text. Dadurch kann dem Benutzer zusätzliches visuelles Feedback bereitgestellt 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, Hintergrundfarbe des Texts, Unterstreichungsstil, Unterstreichungsfarbe und Unterstreichungsgewichtung.
Clients, die diese Anzeigeattributinformationen verwenden, sind am häufigsten Anwendungen, können aber auch Textdienste enthalten. Der TSF-Manager vermittelt zwischen dem Anzeigeattributanbieter und dem Client und verfolgt den Anzeigeattributanbieter der spezifischen Anzeigeattribute nach.
Um Anzeigeattribute bereitstellen zu können, muss ein Textdienst Folgendes tun.
- Registrieren Sie den Textdienst als Anzeigeattributanbieter, indem Sie ITfCategoryMgr::RegisterCategory mit dem Klassenbezeichner des Textdiensts für den ersten Parameter, GUID _ TFCAT DISPLAYATTRIBUTEPROVIDER für den zweiten Parameter und dem Klassenbezeichner des Textdiensts erneut für den dritten Parameter _ aufrufen.
- Implementieren Sie ITfDisplayAttributeProvider, und stellen Sie es über die Klassen factory zur Verfügung.
- Implementieren Sie IEnumTfDisplayAttributeInfo, und stellen Sie es über ITfDisplayAttributeProvider::EnumDisplayAttributeInfo zur Verfügung.
- Implementieren Sie ein ITfDisplayAttributeInfo-Objekt für jeden Vom Textdienst bereitgestellten Anzeigeattributtyp.
Anwenden der Anzeigeattribute
Der Textdienst muss das Anzeigeattribut auf einen Textbereich anwenden. Ein Textdienst kann den Eigenschaftswert nur während einer Lese-/Schreibbearbeitungssitzung ändern.
Wenn dies innerhalb einer Lese-/Schreibbearbeitungssitzung erfolgt, wird ein Anzeigeattribut wie folgt angewendet.
- Abrufen eines ITfRange-Objekts, das den Text abdeckt, auf den das Anzeigeattribut angewendet wird.
- Rufen Sie ein ITfProperty-Objekt für die Textattribute ab, indem Sie ITfContext::GetProperty mit GUID _ PROP ATTRIBUTE _ aufrufen.
- Erstellen Sie ein TfGuidAtom-Attribut aus der vom Textdienst definierten Anzeigeattributbezeichner-GUID, indem Sie ITfCategoryMgr::RegisterGUID aufrufen.
- Initialisieren Sie eine VARIANT-Variable mit VT I4, und legen Sie den lVal-Member auf das _ tfGuidAtom fest, das im vorherigen Schritt erstellt wurde.
- Wenden Sie das Anzeigeattribut auf den Bereich an, indem Sie ITfProperty::SetValue mit dem Lese-/Schreibbearbeitungscookie, dem Bereich und dem VARIANT aufrufen, die im vorherigen Schritt initialisiert wurden.
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;
}
Angeben des Anzeigeattributinformationsobjekts
Ein Client erhält ein ITfDisplayAttributeInfo-Objekt auf zwei Arten.
Der Client ruft ITfDisplayAttributeMgr::GetDisplayAttributeInfo mit dem GUID-Bezeichner des Anzeigeattributs auf. Wenn der Client ITfDisplayAttributeMgr::GetDisplayAttributeInfo zum ersten Mal aufruft, erstellt der TSF-Manager eine Instanz des Anzeigeattributanbieters, indem er CoCreateInstance mit dem Klassenbezeichner aufruft, der als erster Parameter an ITfCategoryMgr::RegisterCategory übergeben wird. Nachfolgende Aufrufe von ITfDisplayAttributeMgr::GetDisplayAttributeInfo verwenden das Anzeigeattributanbieterobjekt erneut.
Der TSF-Manager ruft dann ITfDisplayAttributeProvider::GetDisplayAttributeInfo mit dem Anzeigeattribut GUID auf, um das ITfDisplayAttributeInfo-Objekt zu erhalten.
Der TSF-Manager übergibt dann das ITfDisplayAttributeInfo-Objekt zurück an den Client.
Der Client ruft ITfDisplayAttributeMgr::EnumDisplayAttributeInfo auf, um ein IEnumTfDisplayAttributeInfo-Objekt zu erhalten, das alle Anzeigeattribute enthält, die von allen Anzeigeattributanbietern bereitgestellt werden. Der TSF-Manager führt jeden Anzeigeattributanbieter auf und erstellt eine Instanz jedes Anbieters, indem er CoCreateInstance mit dem Klassenbezeichner aufruft, der als dritter Parameter an ITfCategoryMgr::RegisterCategory übergeben wird.
Der TSF-Manager ruft dann den ITfDisplayAttributeProvider::EnumDisplayAttributeInfo jedes Anbieters auf, um ein IEnumTfDisplayAttributeInfo-Objekt zu erhalten, das alle vom Anbieter bereitgestellten Anzeigeattribute enthält.
Der TSF-Manager ruft dann die IEnumTfDisplayAttributeInfo::Next-Methode des Anbieters auf und fügt jedes ITfDisplayAttributeInfo-Objekt hinzu, das dem eigenen Enumerator des Managers abgerufen wurde, bis das Ende der Anbieterenumeration 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 mindestens einmal IEnumTfDisplayAttributeInfo::Next auf, um die ITfDisplayAttributeInfo-Objekte zu erhalten.
Zugehörige Themen
-
IEnumTfDisplayAttributeInfo
-
ITfDisplayAttributeProvider::EnumDisplayAttributeInfo