¿Cuál es la forma correcta y moderna de manejar la entrada de texto arbitrario en un control personalizado en Windows? WM_CHAR? IMM? TSF?
Quiero poder admitir la entrada de texto en un control personalizado de Windows, al igual que EDIT y los controles de edición enriquecidos ya lo hacen, pero no subclasificar ninguno de esos. El control actualmente usa Direct2D y DirectWrite para dibujar texto, y se ejecuta en Windows Vista SP1 con Actualización de plataforma o más reciente (podría cambiarlo a Windows 7 SP1 con Actualización de plataforma o más reciente si decido que necesito funciones más recientes de Direct2D y DirectWrite, suponiendo que sean disponible allí o solo en Windows 8, pero esa es una pregunta diferente ...)
Por lo que vale, en OS X usaríaNSTextInputClient y en GTK + usaríaGtkIMContext. De estas cosas estoy hablando.
La elección obvia es usarWM_CHAR
, que si reúno correctamente, es UTF-16 de forma nativa si la clase de ventana está registrada conRegisterClassW()
y, por lo tanto, debería "funcionar" independientemente de la ubicación. Sin embargo,WM_CHAR
es generado porTranslateMessage()
ysu documentación dice que no hay forma de determinar si unWM_CHAR
ha sido generado o no, ya queTranslateMessage()
siempre devuelve distinto de cero. Necesito poder determinar si el mensaje de teclado actual será manejado por el sistema de texto (y por lo tanto debería ser ignorado); Esto es especialmente cierto ya que todas las claves que no son de texto deben manejarse de forma independiente del diseño (que ya tengo).
También he visto en el código de ejemplo de Windows 7 tanto para la API IMM como para el Marco de servicios de texto. No estoy seguro de si uno es mejor que el otro, y ambos parecen hacer lo mismo. ¿Ellos?
En el caso de IMM, hay una serie deWM_IMM_xxx
mensajes que no estoy seguro de si debería ignorar o no, y cada referencia que he encontrado parece estar en desacuerdo sobre si debo manejarlos en una ventana Unicode o no ... Además, el problema anterior de saber si un El evento clave dado será manejado por IMM o aún no está abierto; ¿hay alguna manera?
TSF tiene un concepto llamado ACP, que parece permitirme usar cualquier formato de almacenamiento de texto que desee para almacenar el texto que realmente voy a usar (es decir, no es una composición en progreso). ¿Es esto cierto? Me gustaría poder almacenar mi texto como UTF-8 con atributos, convirtiéndome a UTF-16 al dibujar (para DirectWrite). ¿Las otras opciones de API también me permiten hacer esto?
¿O estoy completamente en el camino equivocado?
Y como iba aoptar dentro el teclado en pantalla una vez que hago todo eso?
Otras referencias que utilicé:
http://www.catch22.net/tuts/unicode-text-editingGracias.
ACTUALIZAR 7 nov 2016
Después de mirar nuevamente la muestra TsfPad, noto que también parece usarWM_CHAR
; ahora no estoy seguro de cómo incluso usa TSF, aparte de eso lo hace ...