Partilhar via


Fornecendo atributos de exibição

O Text Services Framework (TSF) permite que um serviço de texto forneça atributos de exibição para texto. Isso permite que um feedback visual adicional seja fornecido ao usuário. Por exemplo, um serviço de texto do verificador ortográfico pode realçar uma palavra com erros ortográficos com um sublinhado vermelho. Os atributos de exibição fornecidos são definidos pela estrutura TF_DISPLAYATTRIBUTE e incluem cor do texto, cor do plano de fundo do texto, estilo do sublinhado, cor do sublinhado e espessura 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 Gestor TSF faz a mediação entre o fornecedor de atributos de exibição e o cliente e monitoriza o fornecedor de atributos 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 a partir da fábrica de classes.
  3. Implemente IEnumTfDisplayAttributeInfo e torne-o disponível a partir de ITfDisplayAttributeProvider::EnumDisplayAttributeInfo.
  4. Implemente um ITfDisplayAttributeInfo objeto para cada tipo de atributo de exibição que o serviço de texto fornece.

Aplicando os atributos de exibição

O serviço de texto deve aplicar o atributo "display" 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 e escrita.

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

  1. Obtenha um objeto ITfRange que cubra o texto ao qual o atributo display será aplicado.
  2. Obtenha um objeto ITfProperty para os atributos de texto ao chamar ITfContext::GetProperty com GUID_PROP_ATTRIBUTE.
  3. Crie um TfGuidAtom a partir do identificador de atributo de exibição definido pelo serviço de texto GUID 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 do 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 display. Na primeira vez que o cliente chamar ITfDisplayAttributeMgr::GetDisplayAttributeInfo, o gerente 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. As chamadas subsequentes para ITfDisplayAttributeMgr::GetDisplayAttributeInfo reutilizarão o objeto do provedor de atributo de exibição.

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

    Em seguida, o gerente da TSF passa o objeto ITfDisplayAttributeInfo de volta para o cliente.

  2. O cliente chama ITfDisplayAttributeMgr::EnumDisplayAttributeInfo para obter um IEnumTfDisplayAttributeInfo objeto que contém todos os atributos de exibição fornecidos por todos os provedores de atributos de exibição. O gerenciador 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 gestor TSF chama o ITfDisplayAttributeProvider::EnumDisplayAttributeInfo de cada provedor para obter um objeto IEnumTfDisplayAttributeInfo que contém todos os atributos de exibição do provedor.

    Em seguida, o gestor TSF chama o método IEnumTfDisplayAttributeInfo::Next do provedor, adicionando cada objeto ITfDisplayAttributeInfo obtido ao próprio enumerador do gestor, até alcançar o final da enumeração do provedor.

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