2010-07-20 4 views
7

He creado mi propio control de cuadro de texto de una sola línea en C# .NET 3.5IME en un cuadro de texto personalizado, derivado de Control de

He escrito esta completamente desde cero, incluyendo mi propio código de selección, desplazamiento, copiar/pegar, etc. Incluso puede seleccionar texto de izquierda a derecha, no es que alguna vez use eso ...

El problema que tengo es con la integración IME (editor de métodos de entrada). El IME funciona hasta cierto punto, pero tengo algunos problemas. Voy a enumerar uno de ellos aquí.

Normalmente, utilizando un TextBox, la construcción IME se representa dentro del TextBox. Sin embargo, en mi Control, el IME se muestra en la parte inferior derecha de la pantalla. Intenté mirar otros controles personalizados, incluido el utilizado en SharpDevelop. Sin embargo, esto tenía el mismo problema. Escribir en chino, japonés o coreano hizo que las cosas de IME se hicieran en la parte inferior derecha de la pantalla.

Necesito algunos consejos sobre cómo hacer esto en mi propio cuadro de texto, y miré la API de Windows para IME, pero hay muchas funciones y no tengo ni idea de dónde empezar.

¿Alguna idea?

Está bien si los ejemplos de código están en C++ (administrado/no gestionado) o VB.net. Puedo moverlo con bastante facilidad.

Respuesta

10

OK, parece que no hay muchos expertos IME en StackOverflow ... o nadie está interesado.

De todos modos, lo descubrí.

Básicamente, tengo que atrapar a los siguientes mensajes de Windows:

WM_INPUTLANGCHANGE = 0x51 
WM_KEYUP = 0x101 
WM_CHAR = 0x102 
WM_CONVERTREQUESTEX = 0x108 
WM_IME_STARTCOMPOSITION = 0x10D 
WM_IME_ENDCOMPOSITION = 0x10E 
WM_IME_COMPOSITION = 0x10F 
WM_IME_SETCONTEXT = 0x281 
WM_IME_NOTIFY = 0x282 
WM_IME_CONTROL = 0x283 
WM_IME_COMPOSITIONFULL = 0x284 
WM_IME_SELECT = 0x285 
WM_IME_CHAR = 0x286 
WM_IME_REQUEST = 0x0288 
WM_IME_KEYDOWN = 0x290 
WM_IME_KEYUP = 0x291 

estoy atrapando WM_KEYUP y WM_CHAR, porque si hago clic en alguna parte en el medio de componer un personaje de Corea, no lo entiendo una composición mensaje, pero tengo que agregar ese personaje a mi cuadro de texto, no obstante. Este es un comportamiento extraño, me pregunto si es un error.

Una vez que eso sucede, existen diferentes comportamientos entre coreano, chino y japonés.

El coreano es realmente fácil (aunque no estoy seguro acerca de la conversión a Hanja, porque de todos modos no sé cómo usarla).

Básicamente, para todos los idiomas, cada vez que tengo un WM_IME_COMPOSITION, tengo que llamar a ImmGetCompositionString en Imm32.dll como he descrito en respuesta a this question. Luego lo visualizo como una composición en progreso, pero no lo agrego a mi texto almacenado.

Cuando se ha compuesto una cadena, el mensaje de Windows es diferente para cada IME. Cada vez, puedo obtenerlo del mensaje WM_IME_COMPOSITION.

En Corea, LParam será simplemente GCS_RESULTSTR y WParam será el carácter introducido, que acabo pueden transmitir contenido a char

En 'LParam' japonesa será GCS_RESULTREADSTR | GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE. Tengo que usar el resultado de ImmGetCompositionString que almacené del mensaje anterior WM_IME_COMPOSITION, porque en este momento será una cadena vacía.

En chino, LParam habrá GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE. Es lo mismo que en japonés, excepto cuando el ImmGetCompositionString previamente almacenado está vacío, en cuyo caso necesito convertir WParam en un carácter.

En los tres casos, tengo que asegurarse de que mi comp visualizado en curso se borra.

Si recibo WM_IME_STARTCOMPOSITION, que establece un indicador de composición (y mostrar la cadena de composición en curso)

Si recibo WM_IME_ENDCOMPOSITION puedo borrar esa bandera (y aclaro la cadena de composición en curso).

A veces no recibo WM_IME_ENDCOMPOSITION, por lo que borro mi bandera al recibir WM_CHAR.


Con todo, fue una experiencia de aprendizaje muy interesante, y uno que aún está en curso - pero IME ahora se puede usar en mi control, al fin! Me quedé en el trabajo hasta la 1am para hacerlo.

+1

Acabo de encontrar http://stackoverflow.com/questions/434048/how-do-you-use-ime, habría sido bueno haber visto eso antes! –

Cuestiones relacionadas