Dostarczanie atrybutów wyświetlania
Struktura usług tekstowych (TSF) umożliwia usłudze tekstowej udostępnianie atrybutów wyświetlania tekstu. Dzięki temu można przekazać użytkownikowi dodatkową opinię wizualną. Na przykład usługa sprawdzania pisowni może wyróżnić błędnie napisany wyraz z czerwonym podkreśleniami. Podane atrybuty wyświetlania są definiowane przez strukturę TF_DISPLAYATTRIBUTE i obejmują kolor tekstu, kolor tła tekstu, styl podkreślenia, kolor podkreślenia i wagę podkreślenia.
Klienci korzystający z tych informacji o atrybutach wyświetlania będą najczęściej aplikacjami, ale mogą również zawierać usługi tekstowe. Menedżer TSF pośredniczy między dostawcą atrybutów wyświetlania a klientem oraz śledzi dostawcę odpowiedzialnego za określone atrybuty wyświetlania.
Aby udostępnić atrybuty wyświetlania, usługa tekstowa musi wykonać następujące czynności.
- Zarejestruj usługę tekstową jako dostawcę atrybutów wyświetlania, wywołując ITfCategoryMgr::RegisterCategory z identyfikatorem klasy usługi tekstowej dla pierwszego parametru, GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER dla drugiego parametru i identyfikator klasy usługi tekstowej ponownie dla trzeciego parametru.
- Zaimplementuj ITfDisplayAttributeProvider i udostępnij ją z fabryki klas.
- Zaimplementuj IEnumTfDisplayAttributeInfo i spraw, aby był dostępny przez ITfDisplayAttributeProvider::EnumDisplayAttributeInfo.
- Zaimplementuj obiekt ITfDisplayAttributeInfo dla każdego typu atrybutu wyświetlania zapewnianego przez usługę tekstową.
Stosowanie atrybutów wyświetlania
Usługa tekstowa musi zastosować atrybut wyświetlania do zakresu tekstu. Usługa tekstowa może modyfikować wartość właściwości tylko podczas sesji edycji odczytu/zapisu.
Zakładając, że jest to w sesji edycji odczytu/zapisu, atrybut wyświetlania jest stosowany w następujący sposób.
- Uzyskaj obiekt ITfRange, który obejmuje tekst, do którego zostanie zastosowany atrybut wyświetlania.
- Uzyskaj obiekt ITfProperty dla atrybutów tekstu, wywołując ITfContext::GetProperty za pomocą GUID_PROP_ATTRIBUTE.
- Utwórz TfGuidAtom na podstawie identyfikatora atrybutu wyświetlania zdefiniowanego przez usługę tekstową identyfikatora GUID przez wywołanie ITfCategoryMgr::RegisterGUID.
- Zainicjuj zmienną typu VARIANT jako VT_I4, a następnie ustaw pole lVal na TfGuidAtom utworzony w poprzednim kroku.
- Zastosuj atrybut wyświetlania do zakresu, wywołując ITfProperty::SetValue z ciasteczkiem edycji odczytu/zapisu, zakresem i wariantem zainicjowanym w poprzednim kroku.
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;
}
Dostarczanie obiektu informacji o atrybucie wyświetlania
Klient uzyskuje obiekt ITfDisplayAttributeInfo na jeden z dwóch sposobów.
Klient wywołuje ITfDisplayAttributeMgr::GetDisplayAttributeInfo z identyfikatorem GUID atrybutu wyświetlania. Gdy klient po raz pierwszy wywołuje ITfDisplayAttributeMgr::GetDisplayAttributeInfo, menedżer TSF utworzy wystąpienie dostawcy atrybutów wyświetlania, wywołując metodę CoCreateInstance z identyfikatorem klasy przekazanym jako pierwszy parametr do ITfCategoryMgr::RegisterCategory. Kolejne wywołania ITfDisplayAttributeMgr::GetDisplayAttributeInfo będą ponownie używać obiektu dostawcy atrybutów wyświetlania.
Następnie menedżer TSF wywołuje ITfDisplayAttributeProvider::GetDisplayAttributeInfo z atrybutem wyświetlania identyfikatorem GUID w celu uzyskania obiektu ITfDisplayAttributeInfo.
Następnie menedżer TSF przekazuje obiekt ITfDisplayAttributeInfo z powrotem do klienta.
Klient wywołuje ITfDisplayAttributeMgr::EnumDisplayAttributeInfo, aby uzyskać obiekt IEnumTfDisplayAttributeInfo zawierający wszystkie atrybuty wyświetlania dostarczone przez wszystkich dostawców atrybutów wyświetlania. Menedżer TSF wylicza każdego dostawcę atrybutu wyświetlania i tworzy wystąpienie każdego dostawcy przez wywołanie metody CoCreateInstance z identyfikatorem klasy przekazanym jako trzeci parametr do ITfCategoryMgr::RegisterCategory.
Menedżer TSF następnie wywołuje ITfDisplayAttributeProvider::EnumDisplayAttributeInfo, aby uzyskać obiekt IEnumTfDisplayAttributeInfo, który zawiera wszystkie atrybuty wyświetlania dostarczone przez dostawcę.
Menedżer TSF następnie wywołuje metodę IEnumTfDisplayAttributeInfo::Next, dodając każdy uzyskany obiekt ITfDisplayAttributeInfo do własnego enumeratora menedżera, aż do osiągnięcia końca wyliczenia dostawcy.
Gdy wszystkie obiekty ITfDisplayAttributeInfo dla wszystkich dostawców atrybutów wyświetlania są dodawane do enumeratora menedżera TSF, menedżer zwraca swój enumerator do klienta. Następnie klient wywołuje IEnumTfDisplayAttributeInfo::Next jeden lub więcej razy w celu uzyskania obiektów ITfDisplayAttributeInfo.
Tematy pokrewne
-
IEnumTfDisplayAttributeInfo
-
ITfDisplayAttributeProvider::EnumDisplayAttributeInfo