Compartilhar via


Usando o Preenchimento Automático do Painel de Entrada

No Windows Vista, o Painel de Entrada do Tablet pc integra novos recursos de preenchimento automático que permitem que a lista de Preenchimento Automático de um aplicativo seja atualizada em tempo real à medida que a tinta de um usuário é reconhecida no Painel de Entrada. Além disso, a lista de Preenchimento Automático do aplicativo é posicionada em um local conveniente para usuários do Painel de Entrada. Sem o Preenchimento Automático do Painel de Entrada, o uso de recursos de Preenchimento Automático com o Painel de Entrada é um processo difícil, exigindo que os usuários insiram um caractere por vez e movam o Painel de Entrada para acessar sugestões de preenchimento automático. Com a integração, o Preenchimento Automático é uma ferramenta poderosa para usuários de Tablet PC que acelera e aumenta a facilidade de inserir texto com o Painel de Entrada.

painel de entrada com lista de preenchimento automático do ie

Há três opções para como um aplicativo pode aproveitar a integração de preenchimento automático do Painel de Entrada. Os aplicativos que contêm a funcionalidade de preenchimento automático criada usando o Preenchimento Automático do Shell (por meio da interface IAutoComplete) ou .NET Framework preenchimento automático (por meio da Enumeração AutoCompleteMode) recebem a integração de Preenchimento Automático do Painel de Entrada sem a necessidade de alterações de código. Os aplicativos que incluem campos de texto de preenchimento automático personalizados podem usar a API de Preenchimento Automático do Painel de Entrada para obter a mesma funcionalidade.

Em todos os casos, você pode fazer essas modificações na lista de Preenchimento Automático do aplicativo sem duplicar ou modificar a interface do usuário ou a lógica de previsão usada por um aplicativo para gerar uma lista de preenchimento automático. A lista preenchimento automático continua sendo o proprietário desenhado pelo aplicativo e o conteúdo da lista preenchimento automático é o mesmo que se o texto tivesse sido digitado diretamente no campo de edição.

Há suporte para a integração de preenchimento automático do Painel de Entrada no sistema operacional Windows Vista ou em versões posteriores. A integração do Preenchimento Automático do Painel de Entrada é integrada ao Preenchimento Automático do Shell, começando com o Windows Vista e no desenvolvimento de Windows Forms começando com .NET Framework versão 3.0. Embora IAutoComplete e AutoCompleteMode sejam executados em versões anteriores do Windows, a integração de preenchimento automático do Painel de Entrada não tem suporte no Microsoft Windows XP Tablet PC Edition ou em sistemas operacionais anteriores. Se você executar o Preenchimento Automático do Painel de Entrada em versões anteriores do Tablet PC, os aplicativos reverter ao comportamento de pré-integração.

Motivos para integrar listas de preenchimento automático de aplicativos com o painel de entrada

A integração da lista preenchimento automático de um aplicativo permite a máxima facilidade e velocidade de entrada para os usuários que estão inserindo texto em um campo de texto que inclui funcionalidade de preenchimento automático. Além disso, um aplicativo que inclui a integração de Preenchimento Automático do Painel de Entrada aparece imediatamente como se tivesse sido desenvolvido com o Tablet PC em mente, tornando o aplicativo mais atraente para os usuários de Tablet PC.

Como o Painel de Entrada e a Lista de Preenchimento Automático interagem sem integração

Usando o Painel de Entrada para inserir texto em um campo de texto que inclui uma lista de Preenchimento Automático, mas que não está integrada ao Painel de Entrada:

  1. O usuário coloca o foco no campo de texto e abre o Painel de Entrada.
  2. O usuário grava um ou dois caracteres.
  3. O usuário toca em Inserir. O Painel de Entrada insere o texto no campo de texto do aplicativo. A lista preenchimento automático do aplicativo é exibida e provavelmente está parcial ou completamente obscurecida pelo Painel de Entrada.
  4. O usuário arrasta o Painel de Entrada para descobrir a lista de Preenchimento Automático do aplicativo.
  5. Supondo que a entrada correta esteja incluída na lista preenchimento automático, o usuário agora pode selecionar essa entrada; caso contrário, o usuário deve repetir as etapas 2 e 3.

Este é claramente um processo complicado. As expectativas do usuário de como uma lista de preenchimento automático deve funcionar são frustradas e sua capacidade de executar tarefas sofre.

Como a interação entre o painel de entrada e a lista de preenchimento automático melhora com a integração

Usando o Painel de Entrada para inserir texto em um campo de texto que inclui uma lista de preenchimento automático integrada ao Painel de Entrada:

  1. O usuário coloca o foco no campo de texto e abre o Painel de Entrada.
  2. O usuário grava um ou dois caracteres. A lista preenchimento automático do aplicativo aparece diretamente acima ou diretamente abaixo do Painel de Entrada enquanto o usuário grava texto.
  3. O usuário seleciona a entrada na lista Preenchimento automático; a entrada é inserida diretamente no campo de texto do aplicativo ou o usuário repete a etapa 2 até que a entrada correta seja exibida.

Devido à integração, a lista preenchimento automático é exibida e atualizada enquanto o usuário está escrevendo no Painel de Entrada. Além disso, a lista é posicionada para que seja conveniente para o usuário acessar durante a gravação e não obscurecida pelo Painel de Entrada. Por fim, quando o usuário seleciona um item de uma lista de Preenchimento Automático, o item é inserido diretamente no campo de entrada de texto do aplicativo, permitindo que o usuário ignore a etapa de inserção de texto do Painel de Entrada.

painel de entrada com a lista de preenchimento automático do Outlook Express

Componentes de preenchimento automático padrão que incluem a integração de preenchimento automático do painel de entrada

O IAutoComplete e o AutoCompleteMode incluem a integração interna do Preenchimento Automático do Painel de Entrada. Os aplicativos que usam qualquer um desses componentes padrão de Preenchimento Automático podem aproveitar a funcionalidade de preenchimento automático do Painel de Entrada com pouco ou nenhum trabalho adicional. Além disso, embora o Preenchimento Automático do Painel de Entrada só tenha suporte no Windows Vista ou em novas versões do sistema operacional Windows, os aplicativos que foram criados usando o IAutoComplete antes do lançamento do Windows Vista obtêm a integração do Preenchimento Automático do Painel de Entrada automaticamente quando executados no Windows Vista. As seções a seguir contêm mais informações sobre os elementos IAutoComplete e AutoCompleteMode específicos que incluem a integração de preenchimento automático do Painel de Entrada.

Preenchimento automático do Shell com integração de preenchimento automático do painel de entrada

Os aplicativos que usam iAutoComplete obtêm integração de preenchimento automático do Painel de Entrada gratuitamente. Embora as APIs de preenchimento automático do Shell estejam incluídas no Windows 2000 em diante, a integração de preenchimento automático do Painel de Entrada só é compatível com o Windows Vista e versões mais recentes. No entanto, os aplicativos criados antes do lançamento do Windows Vista que usam o IAutoComplete obtêm automaticamente a integração de preenchimento automático do Painel de Entrada quando executados no Windows Vista.

Para aproveitar o Preenchimento Automático do Tablet dessa maneira, você deve usar o objeto de preenchimento automático (CLSID_Autocomplete). Se você quiser fornecer funcionalidade de preenchimento automático para URLs ou nomes de arquivo, use a função SHAutoComplete para criar o objeto de preenchimento automático.

Além do IAutoComplete, você pode implementar IAutoComplete2 ou IAutoCompleteDropDowns diretamente e ainda obter a integração automática do Preenchimento Automático do Painel de Entrada automaticamente.

Integração de preenchimento automático do painel de entrada com aplicativos .NET Framework

A partir do .NET Framework 3.0, Windows Forms caixas de texto incluem Preenchimento automático. Windows Forms preenchimento automático da caixa de texto é criado com base no Preenchimento Automático do Shell, o que significa que a integração de preenchimento automático do Painel de Entrada também é interna. .NET Framework 3.0 tem suporte no nível inferior nas edições do Windows lançadas antes do Windows Vista. No entanto, como a integração do Preenchimento Automático do Painel de Entrada só tem suporte no Windows Vista ou em versões posteriores, a integração do Preenchimento Automático do Painel de Entrada só funciona em um aplicativo .NET Framework 3.0 quando ele é instalado no Windows Vista ou em versões posteriores.

Os aplicativos que desejam aproveitar a integração do Preenchimento Automático do Painel de Entrada no .NET Framework 3.0 devem usar um Windows Forms TextBox com a propriedade AutoCompleteMode habilitada. Você não precisa fazer nenhum trabalho adicional além de obter Windows Forms preenchimento automático para trabalhar para aproveitar a integração de preenchimento automático do Painel de Entrada.

Usando apIs de preenchimento automático do painel de entrada diretamente

Os desenvolvedores de caixas de texto de preenchimento automático personalizados precisam trabalhar com as APIs de Preenchimento Automático do Painel de Entrada diretamente para obter a experiência de entrada de texto aprimorada que a integração de preenchimento automático do Painel de Entrada habilita em seus aplicativos. As APIs de Preenchimento Automático do Painel de Entrada são incluídas como parte do sistema operacional Windows Vista e como parte do SDK da Plataforma de Tablet versão 1.9 ou posterior. As interfaces de preenchimento automático do Painel de Entrada são interfaces baseadas em COM.

A seção a seguir descreve como trabalhar essas interfaces em detalhes para um aplicativo C++. No entanto, essas interfaces COM podem ser implementadas na maioria das linguagens, incluindo C#, por meio do uso de interoperabilidade COM.

Para implementar a integração do Preenchimento Automático do Painel de Entrada em uma caixa de texto de preenchimento automático personalizado, as duas interfaces necessárias são a Interface ITipAutocompleteProvider e a Interface ITipAutocompleteClient. As definições para essas interfaces são encontradas em TipAutoComplete.h e TipAutoComplete_i.c.

Primeiro, um aplicativo deve definir e instanciar uma classe de provedor de preenchimento automático, que implementa ITipAutocompleteProvider para cada campo de entrada de texto que inclui uma lista de preenchimento automático. Essa classe gerencia o lado do aplicativo da integração de preenchimento automático. Todas as solicitações de preenchimento automático do Painel de Entrada são feitas do cliente de preenchimento automático para o aplicativo por meio do provedor de preenchimento automático do aplicativo. O provedor de preenchimento automático do aplicativo deve ter acesso ao HWND para a lista de preenchimento automático do aplicativo e ao HWIND para o campo de entrada de texto associado. Além disso, os seguintes métodos de ITipAutocompleteProvider devem ser implementados:

  • Método ITipAutocompleteProvider::UpdatePendingText: esse método é usado pelo cliente de preenchimento automático para notificar o aplicativo do texto que um usuário escreveu no Painel de Entrada. Ao receber essa notificação, o provedor é responsável por gerar uma lista de Preenchimento Automático como se o texto tivesse sido digitado no campo de entrada de texto do aplicativo. A passagem de cadeia de caracteres para o provedor de preenchimento automático por meio do Método ITipAutocompleteProvider::UpdatePendingText inclui apenas o texto atualmente no Painel de Entrada. Portanto, se houver texto adicional no campo de entrada de texto, será responsabilidade do provedor acrescentá-lo corretamente ao texto enviado pelo cliente. A passagem de cadeia de caracteres pelo método ITipAutocompleteProvider::UpdatePendingText deve ser tratada como uma substituição para a seleção atual no campo. Se não houver seleção atual, ela deverá ser colocada na posição do ponto de inserção atual. Depois que a lista preenchimento automático for gerada, o provedor deverá chamar o Método ITipAutocompleteProvider::Show passando TRUE para exibir a lista preenchimento automático. O aplicativo não deve armazenar chamadas em cache para UpdatePendingText , mas tratar cada chamada adicional para UpdatePendingText como um cancelamento da chamada anterior para evitar a exibição de uma interface do usuário de lista de preenchimento automático desatualizada. O código de exemplo a seguir ilustra essas práticas.

    HRESULT SampleProvider::UpdatePendingText(BSTR bstrPendingText)
    {
       //Discard previously cached pending text from Input Panel
       m_bstrPending.Empty();
        //Store the new pending text from Input Panel as m_bstrPending
    m_bstrPending = bstrPendingText;
    
        //Get the text from the field in two chunks. The characters to
    //the left of the selection and the characters to the right.
    CComBSTR bstrLeftContext = //Text to the left of the selection
            CComBSTR bstrRightContext = //Text to the right of the selection
    
    //Discard previously cached complete text
        m_bstrCompleteText.Empty();
        //Append to the field text from the left of the selection
        //the text from Input Panel and then append to that
        //the field text to the right of the selection
        m_bstrCompleteText.Append(bstrLeftContext);
        m_bstrCompleteText.Append(m_bstrPending);
        m_bstrCompleteText.Append(bstrRigtContext);
    
        //Update the app's AC list based on m_bstrCompleteText
        //...
    
        //Show the updated AC list by calling the provider's Show method
       Show(true);
       return S_OK;
    }
    
  • Método ITipAutocompleteProvider::Show: esse método é chamado de UpdatePendingText, mas também pode ser chamado pelo cliente de preenchimento automático a qualquer momento. Ao receber essa chamada, o provedor de preenchimento automático deve ocultar ou mostrar o provedor de preenchimento automático, conforme indicado pelo parâmetro . Antes de mostrar a lista preenchimento automático, espera-se que o provedor de preenchimento automático consulte o cliente de preenchimento automático sobre onde posicionar a lista preenchimento automático. Mais informações sobre como posicionar a lista preenchimento automático serão exibidas mais adiante neste artigo.

Em seguida, o aplicativo deve usar a função CoCreateInstance da ATL (Biblioteca de Modelos Ativos) para produzir uma instância da Interface ITipAutocompleteClient com id de classe CLSID_TipAutoCompleteClient como um servidor em processo e, em seguida, registrar o provedor com o cliente. O método ITipAutocompleteClient::AdviseProvider do cliente de preenchimento automático registra o provedor com o cliente para permitir que o cliente chame o objeto do provedor de preenchimento automático do aplicativo. Se tiptsf.dll não estiver presente no sistema, a função CoCreateInstance falhará e retornará REGDB_E_CLASSNOTREG. Neste ponto, o aplicativo pode descartar seu objeto ITipAutocompleteProvider e continuar como se o Painel de Entrada não existisse, porque ele não existe nesse sistema.

O aplicativo pode optar por criar uma instância de ITipAutocompleteClient ou uma instância por campo de texto. A primeira opção exige que o provedor seja cancelado e registrado sempre que o foco for alterado. Mais informações sobre o cancelamento do registro do provedor de preenchimento automático são exibidas posteriormente neste tópico.

Há várias etapas envolvidas no posicionamento da lista de Preenchimento Automático que devem ser coordenadas entre o provedor de preenchimento automático (aplicativo) e o cliente de preenchimento automático (Painel de Entrada). Antes que a lista preenchimento automático seja mostrada, seja como resultado de uma chamada para o método Show do provedor de preenchimento automático ou devido ao usuário inserir texto usando o teclado, o provedor é necessário para consultar o cliente sobre onde posicionar a lista preenchimento automático. O provedor deve seguir as seguintes etapas:

  • Use o Método ITipAutocompleteClient::RequestShowUI do cliente de preenchimento automático para determinar se o Painel de Entrada está pronto para ter a lista de preenchimento automático mostrada. RequestShowUI usa o parâmetro HWND que é o HWND para a janela Lista de preenchimento automático e o método retorna TRUE ou FALSE para indicar se é o estado em que a lista de preenchimento automático pode ser mostrada. Se o cliente retornar FALSE, o provedor não deverá tentar mostrar a lista preenchimento automático.

  • Chame RequestShowUI para definir o identificador da janela de lista de preenchimento automático pop-up antes de chamar o Método ITipAutocompleteClient::P referredRects. Não fazer isso causará um erro de E_INVALIDARG ao chamar PreferredRects.

  • Se RequestShowUI retornar TRUE, o provedor deverá calcular o retângulo de coordenadas de tela padrão da lista preenchimento automático com base no local do campo de entrada de texto e, em seguida, chamar o Método ITipAutocompleteClient::P referredRects do cliente de preenchimento automático. Isso permite que o cliente de preenchimento automático ajuste o retângulo para evitar que a lista de preenchimento automático se sobreponha ao Painel de Entrada. O método PreferredRects usa quatro parâmetros:

    • RECT rcACList: o retângulo de coordenada de tela padrão da lista preenchimento automático.
    • RECT rcField: o retângulo de coordenada de tela do campo de entrada de texto correspondente.
    • RECT *prcModifiedACList: o retângulo de coordenada de tela ajustado para o preenchimento automático
    • BOOL *pfShowAbove: esse parâmetro indica ao provedor se o retângulo prcModifiedACList posiciona a lista preenchimento automático acima ou abaixo do Painel de Entrada. O aplicativo pode usar essas informações para desenhar corretamente elementos de interface do usuário, como alças de redimensionamento e barras de rolagem. Inicialmente, o provedor deve passar na direção em que a lista de preenchimento automático seria posicionada em relação ao campo de entrada de texto por rcACList. O cliente não alterará pfShowAbove se definir prcModifiedACList igual a rcACList.

    Use os valores retornados dos argumentos prcModifiedACList e pfShowAbove out para posicionar e mostrar a janela Lista de preenchimento automático. Se o Painel de Entrada não estiver em uso, RequestShowUI sempre retornará TRUE e prcModifiedACList será sempre o mesmo que rcACList. pfShowAbove também é inalterado, o resultado é que as chamadas não afetam o comportamento do aplicativo. O código de exemplo a seguir ilustra essas práticas.

HRESULT SampleProvider::Show(BOOL fShow)
{
    //Ask the AC client if it is OK to show the Autocomplete list.
    BOOL fAllowShowing = FALSE;
    m_spACClient->RequestShowUI(m_hWndList, &fAllowShowing);

    if (fShow && fAllowingShowing)
        {
            // Create the parameters required to call PreferredRects
            RECT rcField = //Rectangle for app's text field
            RECT rcACList = //Default rectangle for app's AC list
            RECT rcModifiedACList = {0, 0, 0, 0};
            BOOL fShowAbove = TRUE;

//Ask the AC client to modify the position of the AC list
m_spACClient->PreferredRects(&rcACList, &rcField,
&rcModifiedACList, &fShowAbove);

            //Show the Autocomplete UI at the modified preferred rectangle
            //from rcModifiedACList and the directional info provide by
//fShowAbove
            //...
        }
    else
        {
        //Hide the Autocomplete list and clean up
        //...
        }
    return S_OK;
}

Quando o usuário seleciona um item na lista Preenchimento Automático, o provedor precisa chamar o Método ITipAutocompleteClient::UserSelection do cliente, além de inserir o texto do item selecionado no campo de entrada de texto. O Painel de Entrada usa essa notificação para descartar todo o texto restante que ainda não foi inserido do Painel de Entrada.

Por fim, quando o provedor não for mais necessário, o provedor deverá ser desvinculado do cliente de preenchimento automático chamando o Método ITipAutocompleteClient::UnadviseProvider do cliente de preenchimento automático para cancelar o registro do provedor. O provedor pode precisar ser cancelado por um dos dois motivos: porque o campo de entrada de texto ao qual o provedor está associado foi destruído ou porque o aplicativo opta por criar apenas um cliente de preenchimento automático, em vez de um por campo de entrada de texto. Nessa instância, o provedor deve ser cancelado sempre que o foco for desligado do campo de texto.

Conclusão

A integração de Preenchimento Automático do Painel de Entrada é uma ferramenta poderosa para melhorar a experiência do usuário em aplicativos do Windows que incluem listas de preenchimento automático em computadores Tablet. Sem integração, os usuários do Painel de Entrada precisam passar por um processo tedioso de inserir um caractere de texto por vez e reposicionar o Painel de Entrada para usar o Preenchimento Automático. Com a integração, as listas de preenchimento automático aparecem em um local conveniente à medida que os usuários tinta no Painel de Entrada, aumentando a velocidade e a facilidade de entrada de texto. Em aplicativos que incluem a funcionalidade de Preenchimento Automático criada com base no Preenchimento Automático do Shell ou .NET Framework Preenchimento Automático 3.0, a integração de Preenchimento Automático do Painel de Entrada é um recurso gratuito e atraente. Além disso, um conjunto simples de interfaces baseadas em COM é fornecido para habilitar a mesma experiência integrada para aplicativos que optam por usar controles de preenchimento automático personalizados.

Referência do painel de entrada de texto