Compartilhar via


Exemplo de PenInputPanel

Este exemplo se baseia no exemplo de Formulário de Declarações Automáticas integrando o objeto PenInputPanel . O exemplo está no diretório PIPanel do C# na pasta AutoClaims.

Observação

Este exemplo requer que seu sistema esteja equipado com um dispositivo de caneta. Se você estiver usando apenas um mouse (ou outro dispositivo apontador HID (dispositivo de interface não humana), o PenInputPanel não será exibido.

 

Para obter mais informações sobre o exemplo de Formulário de Declarações Automáticas, consulte Auto Claims Form Sample. Para obter mais informações sobre o objeto PenInputPanel , consulte Programando o painel de entrada usando a classe PenInputPanel.

No exemplo, o Formulário de Declarações Automáticas contém cinco campos nos quais o usuário é solicitado a colocar informações relevantes para a declaração: número da política, nome segurado, ano, make e modelo do carro. Um objeto PenInputPanel é anexado a cada campo de entrada para fornecer um meio fácil de inserir valores com uma caneta.

Há duas técnicas para anexar um objeto PenInputPanel aos campos de entrada em seu formulário. A primeira técnica é atribuir uma instância separada do objeto a cada campo de entrada em tempo de design. A segunda é criar uma única instância do objeto e, em seguida, anexar essa instância de objeto em tempo de execução a um campo quando ele receber o foco. Este exemplo demonstra ambas as técnicas.

Há compensações envolvidas na decisão de qual técnica usar. A criação de uma instância exclusiva do objeto para cada campo de formulário requer um pouco mais de memória quando o formulário é carregado. No entanto, ele salva a necessidade de manipular eventos de foco para que os campos atribuam uma única instância ao campo atual em tempo de execução.

Como o objeto PenInputPanel tem suporte apenas em um Tablet PC, o exemplo cria os objetos PenInputPanel em um bloco de tratamento de exceções.

Um objeto por campo

O exemplo demonstra a primeira técnica (um objeto PenInputPanel por campo) atribuindo os campos de entrada para o número da política (inkEdPolicyNumber) e o nome segurado (inkEdName) uma instância exclusiva do objeto PenInputPanel. Um construtor sobrecarregado para o objeto PenInputPanel pode assumir o nome do controle de entrada como um argumento, associando assim os controles. As seguintes linhas do manipulador de eventos Load do formulário mostram o seguinte:

pipPolicyNumber = new PenInputPanel(inkEdPolicyNumber);
pipName = new PenInputPanel(inkEdName);

Um objeto por formulário

A segunda técnica também é mostrada no exemplo: uma única instância de um objeto PenInputPanel , pipShared, é compartilhada entre os campos de entrada Year, Make e Model. O objeto compartilhado é criado usando o construtor padrão.

pipShared = new PenInputPanel();

O uso dessa técnica exige que seu formulário tenha apenas uma única instância do objeto PenInputPanel . Isso salva memória, mas você deve adicionar código para manipular o evento quando um campo de entrada recebe o foco. Quando um controle que usa uma instância compartilhada de um objeto PenInputPanel obtém o foco, defina a propriedade AttachedEditControl do objeto PenInputPanel para esse controle. O código a seguir mostra um manipulador de eventos para os eventos dos Enter campos Ano, Make e Modelo.

private void inkEdYear_Enter(object sender, System.EventArgs e)
{
    // Attach the shared PenInputPanel to the Year field
    pipShared.AttachedEditControl = inkEdYear;

    // set the NUMBER factoid to bias recognition for numbers
    pipShared.Factoid = "NUMBER";

    // Enable correction UI on the inkEdYear field
    pipShared.EnableTsf(true);
}

private void inkEdMake_Enter(object sender, System.EventArgs e)
{
    // Attach the shared PenInputPanel to the Make field
    pipShared.AttachedEditControl = inkEdMake;

    // reset the factoid to bias recognition for general text
    pipShared.Factoid = "DEFAULT";

    // Enable correction UI on the inkEdMake field
    pipShared.EnableTsf(true);
}
private void inkEdModel_Enter(object sender, System.EventArgs e)
{
    // Attach the shared PenInputPanel to the Model field
    pipShared.AttachedEditControl = inkEdModel;

    // reset the factoid to bias recognition for general text
    pipShared.Factoid = "DEFAULT";

    // Enable correction UI on the inkEdModel field
    pipShared.EnableTsf(true);
}

Defina todas as propriedades que precisam ser definidas quando o foco mudar para um novo controle. Nos manipuladores de eventos anteriores, por exemplo, a propriedade Factoid é definida conforme apropriado.

Considerações sobre usabilidade

Tenha em mente as seguintes considerações de usabilidade ao usar o objeto PenInputPanel em seu aplicativo.

Posicionando o PenInputPanel

Como os campos são dispostos verticalmente no formulário neste exemplo, a interface do usuário PenInputPanel para cada controle de entrada é posicionada ligeiramente à direita do controle de entrada para facilitar o uso. Isso impede que o PenInputPanel encobrisse a próxima caixa de edição, facilitando o direcionamento para a próxima caixa de edição.

pipShared.HorizontalOffset = 32;
pipPolicyNumber.HorizontalOffset = 32;
pipName.HorizontalOffset = 32;

Selecionando o painel de entrada a ser exibido

Como os números de política geralmente são combinações de números, letras e outros caracteres, eles podem ser propensos a erros de reconhecimento. Portanto, o exemplo define o painel padrão exibido pelo objeto PenInputPanel como o teclado quando ele é anexado ao campo número da política.

pipPolicyNumber.DefaultPanel = PanelType.Keyboard;

O comportamento padrão do objeto PenInputPanel é usar o painel que o usuário selecionou por último.

Interface do usuário de correção da Estrutura dos Serviços de Texto

Neste exemplo, todos os campos de entrada são controles InkEdit . Isso é significativo porque o controle InkEdit tem suporte interno para o TSF ( Text Services Framework ) e, portanto, é capaz de dar suporte à interface do usuário de correção in-loco para entrada recebida do objeto PenInputPanel .

O valor padrão para EnableTsf é TRUE. Isso faz com que o objeto PenInputPanel tente iniciar o TSF (Text Services Framework) no controle anexado. Se tiver êxito, a interface do usuário de correção será exibida no controle e permitirá o acesso a alternativas de reconhecimento. Chamar esse método com um parâmetro FALSE tenta desligar o TSF no controle anexado.

O controle InkEdit já fornece uma interface do usuário de correção, mas no exemplo EnableTsf é usado para permitir que o PenInputPanel use o contexto do reconhecedor de inserção TSF em vez da função SendInput para enviar os resultados do reconhecimento de manuscrito para o controle. O resultado é que o texto pode ser inserido mesmo que o campo não tenha mais foco.

  pipName.EnableTsf(true);
  pipPolicyNumber.EnableTsf(true);

Fechando o formulário

No Windows Form Designer código gerado, os controles InkEdit e InkPicture são adicionados à lista de componentes do formulário quando o formulário é inicializado. Quando o formulário é fechado, os controles InkEdit e InkPicture são descartados, bem como os outros componentes do formulário, pelo método Dispose do formulário. O método Dispose do formulário também descarta os objetos Ink criados para o formulário.