Qual é a maneira correta e moderna de lidar com a entrada de texto arbitrária em um controle personalizado no Windows? WM_CHAR? IMM? TSF?
Quero poder oferecer suporte à entrada de texto em um controle personalizado do Windows, assim como os controles de edição e edição avançada já o fazem, mas sem subclassificar nenhum deles. Atualmente, o controle usa o Direct2D e o DirectWrite para desenhar texto e é executado no Windows Vista SP1 com Atualização da Plataforma ou mais recente (eu posso alterá-lo para Windows 7 SP1 com Atualização da Plataforma ou mais recente se eu decidir que preciso de recursos mais recentes do Direct2D e DirectWrite, supondo que sejam disponível apenas no Windows 8 ou no Windows 8, mas essa é uma pergunta diferente ...)
Para o que vale a pena, no OS X eu usariaNSTextInputClient e no GTK + eu usariaGtkIMContext. É sobre essas coisas que eu estou falando.
A escolha óbvia é usarWM_CHAR
, que se eu reunir corretamente, será nativamente UTF-16 se a classe da janela estiver registrada comRegisterClassW()
e, portanto, deve "apenas funcionar" independentemente do local. Contudo,WM_CHAR
é gerado porTranslateMessage()
esua documentação diz que não há como determinar se umWM_CHAR
foi gerado ou não, poisTranslateMessage()
sempre retorna diferente de zero. Eu preciso ser capaz de determinar se a mensagem atual do teclado será tratada pelo sistema de texto (e, portanto, deve ser ignorada); isso é especialmente verdadeiro, pois todas as chaves que não são de texto precisam ser tratadas de maneira independente do layout (que eu já tenho).
Também vi no código de amostra do Windows 7 a API do IMM e o Text Services Framework. Não tenho certeza se um é melhor que o outro, e ambos parecem fazer a mesma coisa. Eles?
No caso do IMM, existem váriosWM_IMM_xxx
mensagens que não tenho certeza se devo ignorar ou não, e todas as referências que encontrei parecem discordar quanto a lidar com elas em uma janela Unicode ou não ... Além disso, o problema acima de saber se um dado evento-chave será tratado pelo IMM ou ainda não está aberto; Há algum caminho?
O TSF tem um conceito chamado ACP, que parece me permitir usar qualquer formato de armazenamento de texto que eu queira para armazenar o texto que eu realmente vou usar (ou seja, não uma composição em andamento). Isso é verdade? Gostaria de poder armazenar meu texto como UTF-8 com atributos, convertendo-o em UTF-16 ao desenhar (para DirectWrite). As outras opções de API também me permitem fazer isso?
Ou estou completamente no caminho errado?
E como euoptar para dentro a teclado na tela uma vez que eu faço tudo isso?
Outras referências que usei:
http://www.catch22.net/tuts/unicode-text-editingObrigado.
ATUALIZAR 7 Nov 2016
Depois de examinar o exemplo do TsfPad novamente, percebo que ele também parece apenas usarWM_CHAR
; agora não tenho certeza de como ele usa o TSF, além disso ...