Compartilhar via


Fornecendo atributos de exibição

O TSF (Text Services Framework) permite que um serviço de texto forneça atributos de exibição para texto. Isso permite que comentários visuais adicionais sejam fornecidos ao usuário. Por exemplo, um serviço de texto do verificador ortográfico pode realçar uma palavra com ortografia incorreta com um sublinhado vermelho. Os atributos de exibição fornecidos são definidos pela estrutura TF_DISPLAYATTRIBUTE e incluem cor do texto, cor da tela de fundo do texto, estilo sublinhado, cor do sublinhado e peso do sublinhado.

Os clientes que usam essas informações de atributo de exibição geralmente serão aplicativos, mas também podem incluir serviços de texto. O gerenciador do TSF é mediado entre o provedor de atributo de exibição e o cliente e acompanha o provedor de atributo de exibição dos atributos de exibição específicos.

Para fornecer atributos de exibição, um serviço de texto deve fazer o seguinte.

  1. Registre o serviço de texto como um provedor de atributo de exibição chamando ITfCategoryMgr::RegisterCategory com o identificador de classe do serviço de texto para o primeiro parâmetro, GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER para o segundo parâmetro e o identificador de classe do serviço de texto novamente para o terceiro parâmetro.
  2. Implemente ITfDisplayAttributeProvider e disponibilize-o na fábrica de classes.
  3. Implemente IEnumTfDisplayAttributeInfo e disponibilize-o em ITfDisplayAttributeProvider::EnumDisplayAttributeInfo.
  4. Implemente um objeto ITfDisplayAttributeInfo para cada tipo de atributo de exibição fornecido pelo serviço de texto.

Aplicando os atributos de exibição

O serviço de texto deve aplicar o atributo de exibição a um intervalo de texto. Um serviço de texto só pode modificar o valor da propriedade durante uma sessão de edição de leitura/gravação.

Supondo que isso esteja dentro de uma sessão de edição de leitura/gravação, um atributo de exibição é aplicado da maneira a seguir.

  1. Obtenha um objeto ITfRange que abrange o texto ao qual o atributo de exibição será aplicado.
  2. Obtenha um objeto ITfProperty para os atributos de texto chamando ITfContext::GetProperty com GUID_PROP_ATTRIBUTE.
  3. Crie um TfGuidAtom do GUID do identificador de atributo de exibição definido pelo serviço de texto chamando ITfCategoryMgr::RegisterGUID.
  4. Inicialize uma variável VARIANT para VT_I4 e defina o membro lVal para o TfGuidAtom criado na etapa anterior.
  5. Aplique o atributo de exibição ao intervalo chamando ITfProperty::SetValue com o cookie de edição de leitura/gravação, o intervalo e o VARIANT inicializados na etapa anterior.
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;
}

Fornecendo o objeto de informações de atributo de exibição

Um cliente obtém um objeto ITfDisplayAttributeInfo de uma das duas maneiras.

  1. O cliente chama ITfDisplayAttributeMgr::GetDisplayAttributeInfo com o identificador GUID do atributo de exibição. Na primeira vez que o cliente chamar ITfDisplayAttributeMgr::GetDisplayAttributeInfo, o gerenciador do TSF criará uma instância do provedor de atributo de exibição chamando CoCreateInstance com o identificador de classe passado como o primeiro parâmetro para ITfCategoryMgr::RegisterCategory. Chamadas subsequentes para ITfDisplayAttributeMgr::GetDisplayAttributeInfo reutilizarão o objeto do provedor de atributo de exibição.

    Em seguida, o gerenciador do TSF chama ITfDisplayAttributeProvider::GetDisplayAttributeInfo com o GUID do atributo de exibição para obter o objeto ITfDisplayAttributeInfo .

    Em seguida, o gerenciador do TSF passa o objeto ITfDisplayAttributeInfo de volta para o cliente.

  2. O cliente chama ITfDisplayAttributeMgr::EnumDisplayAttributeInfo para obter um objeto IEnumTfDisplayAttributeInfo que contém todos os atributos de exibição fornecidos por todos os provedores de atributo de exibição. O gerenciador do TSF enumera cada provedor de atributo de exibição e cria uma instância de cada provedor chamando CoCreateInstance com o identificador de classe passado como o terceiro parâmetro para ITfCategoryMgr::RegisterCategory.

    Em seguida, o gerenciador do TSF chama ITfDisplayAttributeProvider::EnumDisplayAttributeInfo de cada provedor para obter um objeto IEnumTfDisplayAttributeInfo que contém todos os atributos de exibição fornecidos pelo provedor.

    Em seguida, o gerenciador do TSF chama o método IEnumTfDisplayAttributeInfo::Next do provedor, adicionando cada objeto ITfDisplayAttributeInfo obtido ao próprio enumerador do gerente até que o final da enumeração do provedor seja atingido.

    Quando todos os objetos ITfDisplayAttributeInfo para todos os provedores de atributo de exibição são adicionados ao enumerador do gerenciador do TSF, o gerenciador retorna seu enumerador para o cliente. Em seguida, o cliente chama IEnumTfDisplayAttributeInfo::Next uma ou mais vezes para obter os objetos 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