Dela via


Tillhandahållande av visningsinställningar

Med Text Services Framework (TSF) kan en texttjänst tillhandahålla visningsattribut för text. Detta gör att ytterligare visuell feedback kan skickas till användaren. En texttjänst för stavningskontroll kan till exempel markera ett felstavat ord med en röd understrykning. De visningsattribut som tillhandahålls definieras av TF_DISPLAYATTRIBUTE struktur och inkluderar textfärg, textbakgrundsfärg, understrykningsformat, understrykningsfärg och understrykningsvikt.

Klienter som använder den här visningsattributinformationen är oftast program, men kan även innehålla texttjänster. TSF-hanteraren förmedlar mellan visningsattributprovidern och klienten och spårar visningsattributprovidern för de specifika visningsattributen.

För att tillhandahålla visningsattribut måste en texttjänst göra följande.

  1. Registrera texttjänsten som en visningsattributprovider genom att anropa ITfCategoryMgr::RegisterCategory med klassidentifieraren för texttjänsten för den första parametern, GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER för den andra parametern och klassidentifieraren för texttjänsten igen för den tredje parametern.
  2. Implementera ITfDisplayAttributeProvider och gör den tillgänglig från klassfabriken.
  3. Implementera IEnumTfDisplayAttributeInfo och gör den tillgänglig från ITfDisplayAttributeProvider::EnumDisplayAttributeInfo.
  4. Implementera ett ITfDisplayAttributeInfo- objekt för varje typ av visningsattribut som texttjänsten tillhandahåller.

Använda visningsattributen

Texttjänsten måste använda visningsattributet för ett textintervall. En texttjänst kan bara ändra egenskapsvärdet under en läs-/skrivredigeringssession.

Förutsatt att detta sker inom en läs-/skrivredigeringssession tillämpas ett visningsattribut på följande sätt.

  1. Hämta ett ITfRange- objekt som täcker den text som visningsattributet ska tillämpas på.
  2. Hämta ett ITfProperty- objekt för textattributen genom att anropa ITfContext::GetProperty med GUID_PROP_ATTRIBUTE.
  3. Skapa en TfGuidAtom från texttjänstdefinierade visningsattributidentifieraren GUID genom att anropa ITfCategoryMgr::RegisterGUID.
  4. Initiera en VARIANT-variabel till VT_I4 och sätt lVal medlemsvärde till TfGuidAtom som skapades i föregående steg.
  5. Tillämpa visningsattributet på intervallet genom att anropa ITfProperty::SetValue med cookie för läs/skriv-redigering, intervallet och VARIANT som initierades i föregående steg.
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;
}

Tillhandahålla informationsobjektet för visningsattribut

En klient hämtar ett ITfDisplayAttributeInfo- objekt på något av två sätt.

  1. Klienten anropar ITfDisplayAttributeMgr::GetDisplayAttributeInfo med GUID identifierare för visningsattributet. Första gången klienten anropar ITfDisplayAttributeMgr::GetDisplayAttributeInfoskapar TSF-hanteraren en instans av providern för visningsattributet genom att anropa CoCreateInstance med klassidentifieraren som skickas som den första parametern till ITfCategoryMgr::RegisterCategory. Efterföljande anrop till ITfDisplayAttributeMgr::GetDisplayAttributeInfo återanvänder providerobjektet för visningsattributet.

    TSF-chefen anropar sedan ITfDisplayAttributeProvider::GetDisplayAttributeInfo med visningsattributet GUID- för att hämta ITfDisplayAttributeInfo-objektet.

    TSF-chefen skickar sedan ITfDisplayAttributeInfo-objektet tillbaka till klienten.

  2. Klienten anropar ITfDisplayAttributeMgr::EnumDisplayAttributeInfo för att hämta ett IEnumTfDisplayAttributeInfo- objekt som innehåller alla visningsattribut som tillhandahålls av alla visningsattributprovidrar. TSF-hanteraren går igenom varje visningsattributleverantör och skapar en instans av varje leverantör genom att anropa CoCreateInstance med klassidentifieraren som skickas som tredje parameter till ITfCategoryMgr::RegisterCategory.

    TSF-chefen anropar sedan varje providers ITfDisplayAttributeProvider::EnumDisplayAttributeInfo för att hämta ett IEnumTfDisplayAttributeInfo objekt som innehåller alla visningsattribut som tillhandahålls av providern.

    TSF-chefen anropar sedan providerns IEnumTfDisplayAttributeInfo::Nästa-metod och lägger till varje ITfDisplayAttributeInfo objekt som hämtats till chefens egen uppräknare tills slutet av providerns uppräkning har nåtts.

    När alla ITfDisplayAttributeInfo- objekt för alla visningsattributprovidrar läggs till i TSF-chefens uppräknare, returnerar chefen sin uppräknare till klienten. Klienten anropar sedan IEnumTfDisplayAttributeInfo::Nästa en eller flera gånger för att hämta objekten 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::Nästa