Compartir a través de


Usar un editor de métodos de entrada en un juego

Nota

En este artículo se detalla cómo trabajar con el Editor de métodos de entrada (IME) de Windows XP. Se realizaron cambios en el IME para Windows Vista que no se detallan completamente en este artículo. Para obtener más información sobre los cambios en el IME para Windows Vista, consulta Editores de métodos de entrada (IME) en Windows Vista: una vista Ever-Expanding de internacionalización en el Portal de desarrollo e informática global de Microsoft.

Un editor de métodos de entrada (IME) es un programa que permite una entrada de texto fácil con un teclado estándar para idiomas asiáticos orientales, como chino, japonés, coreano y otros idiomas con caracteres complejos. Por ejemplo, con los IME, un usuario puede escribir caracteres complejos en un procesador de texto o un jugador de un juego multijugador masivo en línea puede chatear con amigos en personajes complejos.

En este artículo se explica cómo puede implementar un control de edición de IME básico en una aplicación Microsoft DirectX de pantalla completa. Las aplicaciones que aprovechan DXUT obtienen automáticamente la funcionalidad IME. En el caso de las aplicaciones que no usan el marco de trabajo, en este artículo se describe cómo agregar compatibilidad con IME a un control de edición.

Contenido:

Comportamiento predeterminado de IME

Los IMEs asignan la entrada del teclado a componentes fonéticos u otros elementos de idioma específicos de un idioma seleccionado. En un escenario típico, el usuario escribe claves que representan la pronunciación de un carácter complejo. Si el IME reconoce la pronunciación como válida, presenta al usuario una lista de candidatos de palabras o frases de los que el usuario puede seleccionar una opción final. A continuación, la palabra elegida se envía a la aplicación a través de una serie de mensajes de Microsoft Windows WM_CHAR . Dado que el IME funciona en un nivel por debajo de la aplicación interceptando la entrada del teclado, la presencia de un IME es transparente para la aplicación. Casi todas las aplicaciones de Windows pueden aprovechar fácilmente las IME sin tener en cuenta su existencia y sin necesidad de codificación especial.

Un IME típico muestra varias ventanas para guiar al usuario a través de la entrada de caracteres, como se muestra en los ejemplos siguientes.

ime muestra varias ventanas

Tipo de ventana Descripción Salida de IME
A. Ventana de lectura Contiene pulsaciones de tecla del teclado; normalmente cambia después de cada pulsación de tecla. cadena de lectura
B. Ventana composición Contiene la colección de caracteres que el usuario ha compuesto con el IME. Estos caracteres se dibujan mediante el IME en la parte superior de la aplicación. Cuando el usuario notifica al IME que la cadena de composición es satisfactoria, el IME envía la cadena de composición a la aplicación a través de una serie de mensajes de WM_CHAR. cadena de composición
C. Ventana Candidata Cuando el usuario ha escrito una pronunciación válida, el IME muestra una lista de caracteres candidatos que coinciden con la pronunciación especificada. A continuación, el usuario selecciona el carácter previsto de esta lista y el IME agrega este carácter a la pantalla Ventana de composición. el siguiente carácter de la cadena de composición
D. Indicador de configuración regional de entrada Muestra el idioma que el usuario ha seleccionado para la entrada del teclado. Este indicador está incrustado en la barra de tareas de Windows. Para seleccionar el idioma de entrada, abra la Panel de control Opciones regionales y de idioma y, a continuación, haga clic en Detalles en la pestaña Idiomas. -

Uso de IME con DXUT

En DXUT, la clase CDXUTIMEEditBox implementa la funcionalidad IME. Esta clase se deriva de la clase CDXUTEditBox, el control de edición básico proporcionado por el marco de trabajo. CDXUTIMEEditBox amplía ese control de edición para admitir IMEs reemplazando los métodos CDXUTIMEEditBox. Las clases están diseñadas de esta manera para ayudar a los desarrolladores a aprender lo que necesitan tomar del marco para implementar la compatibilidad con IME en sus propios controles de edición. En el resto de este tema se explica cómo el marco y CDXUTIMEEditBox, en particular, invalida un control de edición básico para implementar la funcionalidad IME.

La mayoría de las variables específicas de IME en CDXUTIMEEditBox se declaran como estáticas, ya que muchos búferes y estados de IME son específicos del proceso. Por ejemplo, un proceso solo tiene un búfer para la cadena de composición. Incluso si el proceso tiene diez controles de edición, todos compartirán el mismo búfer de cadena de composición. Por lo tanto, el búfer de cadenas de composición para CDXUTIMEEditBox es estático, lo que impide que la aplicación ocupe espacio de memoria innecesario.

CDXUTIMEEditBox se implementa en el código DXUT siguiente:

(raíz del SDK)\Samples\C++\Common\DXUTgui.cpp

Invalidación del comportamiento predeterminado de IME

Normalmente, un IME usa procedimientos estándar de Windows para crear una ventana (consulte Uso de Windows). En circunstancias normales, esto produce resultados satisfactorios. Sin embargo, cuando la aplicación se presenta en modo de pantalla completa, como es habitual para juegos, las ventanas estándar ya no funcionan y es posible que no se muestren en la parte superior de la aplicación. Para solucionar este problema, la aplicación debe dibujar las ventanas IME en lugar de confiar en Windows para realizar esta tarea.

Cuando el comportamiento predeterminado de creación de ventanas IME no proporciona lo que requiere una aplicación, la aplicación puede invalidar el control de ventanas de IME. Una aplicación puede lograrlo procesando mensajes relacionados con IME y llamando a la API de Input Method Manager (IMM).

Cuando un usuario interactúa con un IME para escribir caracteres complejos, IMM envía mensajes a la aplicación para notificarle eventos importantes, como iniciar una composición o mostrar la ventana candidata. Normalmente, una aplicación omite estos mensajes y los pasa al controlador de mensajes predeterminado, lo que hace que el IME los controle. Cuando la aplicación, en lugar del controlador predeterminado, controla los mensajes, controla exactamente lo que sucede en cada uno de los eventos IME. A menudo, el controlador de mensajes recupera el contenido de las distintas ventanas de IME mediante una llamada a la API de IMM. Una vez que la aplicación tiene esta información, puede dibujar correctamente las ventanas IME cuando necesita representarse en la pantalla.

Functions

Un IME debe obtener la cadena de lectura, ocultar la ventana de lectura y obtener la orientación de la ventana de lectura. En esta tabla se muestran las funcionalidades por versión IME:

Obtención de la cadena de lectura Ocultar ventana de lectura Orientación de la ventana de lectura
Antes de la versión 6.0 A. Leer datos privados de IME de Acceso a ventanas directamente. Vea "4 Structure" (Estructura 4). Interceptar mensajes privados de IME. Vea "3 mensajes" Examine la información del Registro. Consulte "5 Información del Registro"
Después de la versión 6.0 GetReadingString ShowReadingWindow GetReadingString

error de Hadoop

Los siguientes mensajes no tienen que procesarse para un IME más reciente que implemente ShowReadingWindow().

Los siguientes mensajes se capturan mediante el controlador de mensajes de la aplicación (es decir, no se pasan a DefWindowProc) para evitar que aparezca la ventana de lectura.

Msg == WM_IME_NOTIFY
wParam == IMN_PRIVATE
lParam == 1, 2 (CHT IME version 4.2, 4.3 and 4.4 / CHS IME 4.1 and 4.2)
lParam == 16, 17, 26, 27, 28 (CHT IME version 5.0, 5.1, 5.2 / CHS IME 5.3)

Ejemplos

En los ejemplos siguientes se muestra cómo obtener información de cadena de lectura de IME anterior que no tiene GetReadingString(). El código genera las salidas siguientes:

Output Descripción
DWORD dwlen Longitud de la cadena de lectura.
DWORD dwerr Índice del carácter de error.
LPWSTR wstr Puntero a la cadena de lectura.
BOOL unicode Si es true, la cadena de lectura está en formato Unicode. De lo contrario, está en formato multibyte.

CHT IME versión 4.2, 4.3 y 4.4

LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
LPBYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + 24);
if (!p) break;
dwlen = *(DWORD *)(p + 7*4 + 32*4);
dwerr = *(DWORD *)(p + 8*4 + 32*4);
wstr = (WCHAR *)(p + 56);
unicode = TRUE;

CHT IME versión 5.0

LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
LPBYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + 3*4);
if (!p) break;
p = *(LPBYTE *)((LPBYTE)p + 1*4 + 5*4 + 4*2 );
if (!p) break;
dwlen = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16);
dwerr = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 + 1*4);
wstr = (WCHAR *)(p + 1*4 + (16*2+2*4) + 5*4);
unicode = FALSE;

CHT IME versión 5.1, 5.2 y CHS IME versión 5.3

LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
LPBYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + 4);
if (!p) break;
p = *(LPBYTE *)((LPBYTE)p + 1*4 + 5*4); 
if (!p) break;
dwlen = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 * 2);
dwerr = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 * 2 + 1*4);
wstr  = (WCHAR *) (p + 1*4 + (16*2+2*4) + 5*4);
unicode = TRUE;

CHS IME versión 4.1

// GetImeId(1) returns VS_FIXEDFILEINFO:: dwProductVersionLS of IME file
int offset = ( GetImeId( 1 ) >= 0x00000002 ) ? 8 : 7;
LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
BYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + offset * 4);
if (!p) break;
dwlen = *(DWORD *)(p + 7*4 + 16*2*4);
dwerr = *(DWORD *)(p + 8*4 + 16*2*4);
dwerr = min(dwerr, dwlen);
wstr = (WCHAR *)(p + 6*4 + 16*2*1);
unicode = TRUE;

CHS IME versión 4.2

int nTcharSize = IsNT() ? sizeof(WCHAR) : sizeof(char);
LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
BYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + 1*4 + 1*4 + 6*4);
if (!p) break;
dwlen = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 * nTcharSize);
dwerr = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 * nTcharSize + 1*4);
wstr  = (WCHAR *) (p + 1*4 + (16*2+2*4) + 5*4);
unicode = IsNT() ? TRUE : FALSE;

Mensajes IME

Una aplicación de pantalla completa debe controlar correctamente los siguientes mensajes relacionados con IME:

WM_INPUTLANGCHANGE

IMM envía un mensaje de WM_INPUTLANGCHANGE a la ventana activa de una aplicación después de que el usuario haya cambiado la configuración regional de entrada con una combinación de teclas (normalmente ALT+MAYÚS) o con el indicador de configuración regional de entrada en la barra de tareas o la barra de idioma. La barra de idioma es un control en pantalla con el que el usuario puede configurar un servicio de texto. (Vea Cómo mostrar la barra de idioma). La siguiente captura de pantalla muestra una lista de selección de idioma que se muestra cuando el usuario hace clic en el indicador de configuración regional.

lista de selección de idioma que se muestra cuando el usuario hace clic en el indicador de configuración regional

Cuando el IMM envía un mensaje de WM_INPUTLANGCHANGE, CDXUTIMEEditBox debe realizar varias tareas importantes:

  1. Se llama al método GetKeyboardLayout para devolver el identificador de configuración regional de entrada (ID) para el subproceso de aplicación. La clase CDXUTIMEEditBox guarda este identificador en su variable de miembro estático s_hklCurrent para su uso posterior. Es importante que la aplicación conozca la configuración regional de entrada actual, ya que el IME de cada idioma tiene su propio comportamiento distinto. Es posible que el desarrollador tenga que proporcionar código diferente para diferentes configuraciones regionales de entrada.
  2. CDXUTIMEEditBox inicializa una cadena que se mostrará en el indicador de idioma del cuadro de edición. Este indicador puede mostrar el idioma de entrada activo cuando la aplicación se ejecuta en modo de pantalla completa y ni la barra de tareas ni la barra de idioma están visibles.
  3. Se llama al método ImmGetConversionStatus para indicar si la configuración regional de entrada está en modo de conversión nativo o no nativo. El modo de conversión nativa permite al usuario escribir texto en el idioma elegido. El modo de conversión no nativo hace que el teclado actúe como un teclado en inglés estándar. Es importante proporcionar al usuario una indicación visual sobre el tipo de modo de conversión en el que se encuentra el IME, de modo que el usuario pueda saber fácilmente qué caracteres esperar al presionar una clave. CDXUTIMEEditBox proporciona esta indicación visual con un color de indicador de idioma. Cuando la configuración regional de entrada usa un IME con modo de conversión nativa, la clase CDXUTIMEEditBox dibuja el texto del indicador con el color definido por el parámetro m_IndicatorImeColor. Cuando el IME está en modo de conversión no nativo o no se usa ningún IME, la clase dibuja el texto del indicador con el color definido por el parámetro m_IndicatorEngColor.
  4. CDXUTIMEEditBox comprueba la configuración regional de entrada y establece la variable de miembro estático s_bInsertOnType en TRUE para coreano y FALSE para todos los demás idiomas. Esta marca es necesaria debido a los diferentes comportamientos de los IME coreanos y de todos los demás IME. Al escribir caracteres en idiomas distintos del coreano, el texto escrito por el usuario se muestra en la ventana de composición y el usuario puede cambiar libremente el contenido de la cadena de composición. El usuario presiona la tecla ENTRAR cuando está satisfecho con la cadena de composición y la cadena de composición se envía a la aplicación como una serie de mensajes de WM_CHAR. Sin embargo, en los IME coreanos, cuando un usuario presiona una tecla para escribir texto, se envía inmediatamente un carácter a la aplicación. Cuando el usuario presiona posteriormente más teclas para modificar ese carácter inicial, el carácter del cuadro de edición cambia para reflejar la entrada adicional del usuario. Básicamente, el usuario está redactando caracteres en el cuadro de edición. Estos dos comportamientos son lo suficientemente diferentes que CDXUTIMEEditBox debe codificar para cada uno de ellos específicamente.
  5. Se llama al método miembro estático SetupImeApi para recuperar direcciones de dos funciones del módulo IME: GetReadingString y ShowReadingWindow. Si existen estas funciones, se llama a ShowReadingWindow para ocultar la ventana de lectura predeterminada de este IME. Dado que la aplicación representa la propia ventana de lectura, notifica al IME que deshabilite el dibujo de la ventana de lectura predeterminada para que no interfiera con la representación en pantalla completa.

IMM envía un mensaje de WM_IME_SETCONTEXT cuando se activa una ventana de la aplicación. El parámetro lParam de este mensaje contiene una marca que indica al IME qué ventanas se deben dibujar y cuáles no. Dado que la aplicación controla todo el dibujo, no necesita que el IME dibuje ninguna de las ventanas IME. Por lo tanto, el controlador de mensajes de la aplicación simplemente establece lParam en 0 y devuelve.

Para que las aplicaciones admitan IME, se necesita un procesamiento especial para el WM_IME_SETCONTEXT de mensajes relacionados con IME. Dado que Windows normalmente envía este mensaje a la aplicación antes de llamar al método PanoramaInitialize(), Panorama no tiene la oportunidad de procesar la interfaz de usuario para mostrar ventanas de lista candidatas.

El siguiente fragmento de código especifica que las aplicaciones de Windows no muestren ninguna interfaz de usuario asociada a la ventana de lista candidata, lo que permite a Panorama controlar específicamente esta interfaz de usuario.

case WM_IME_SETCONTEXT:
         lParam = 0;
    lRet = DefWindowProc(hWnd, msg, wParam, lParam);
    break;
    //... more message processing
    return lRet;

WM_IME_STARTCOMPOSITION

IMM envía un mensaje de WM_IME_STARTCOMPOSITION a la aplicación cuando una composición de IME está a punto de comenzar como resultado de pulsaciones de tecla por parte del usuario. Si el IME usa la ventana de composición, muestra la cadena de composición actual en una ventana de composición. CDXUTIMEEditBox controla este mensaje realizando dos tareas:

  1. CDXUTIMEEditBox borra el búfer de cadena de composición y el búfer de atributos. Estos búferes son miembros estáticos de CDXUTIMEEditBox.
  2. CDXUTIMEEditBox establece la variable de miembro estático s_bHideCaret en TRUE. Este miembro, definido en la clase BASE CDXUTEditBox, controla si el cursor del cuadro de edición se debe dibujar cuando se representa el cuadro de edición. La ventana de composición funciona de forma similar a un cuadro de edición con texto y cursor. Para evitar confusiones cuando la ventana de composición está visible, el cuadro de edición oculta su cursor para que solo un cursor esté visible a la vez.

WM_IME_COMPOSITION

IMM envía un mensaje WM_IME_COMPOSITION a la aplicación cuando el usuario escribe una pulsación de tecla para cambiar la cadena de composición. El valor de lParam indica qué tipo de información puede recuperar la aplicación del Administrador de métodos de entrada (IMM). La aplicación debe recuperar la información disponible llamando a ImmGetCompositionString y, a continuación, debe guardar la información en su búfer privado para que pueda representar los elementos IME más adelante.

CDXUTIMEEditBox comprueba y recupera los siguientes datos de cadena de composición:

WM_IME_COMPOSITION valor de marca lParam data Descripción
GCS_COMPATTR Atributo composition Este atributo contiene información como el estado de cada carácter de la cadena de composición (por ejemplo, convertido o no convertido). Esta información es necesaria porque CDXUTIMEEditBox colorea los caracteres de cadena de composición de forma diferente en función de sus atributos.
GCS_COMPCLAUSE Información de la cláusula Composition Esta información de cláusula se usa cuando el IME japonés está activo. Cuando se convierte una cadena de composición japonesa, los caracteres se pueden agrupar como una cláusula que se convierte en una sola entidad. Cuando el usuario mueve el cursor, CDXUTIMEEditBox usa esta información para resaltar toda la cláusula, en lugar de un solo carácter dentro de la cláusula .
GCS_COMPSTR Cadena de composición Esta cadena es la cadena actualizada compuesta por el usuario. Esta es también la cadena que se muestra en la ventana de composición.
GCS_CURSORPOS Posición del cursor de composición La ventana de composición implementa un cursor, similar al cursor en un cuadro de edición. La aplicación puede recuperar la posición del cursor al procesar el mensaje de WM_IME_COMPOSITION para dibujar el cursor correctamente.
GCS_RESULTSTR Cadena de resultado La cadena de resultado está disponible cuando el usuario está a punto de completar el proceso de composición. Esta cadena debe recuperarse y los caracteres deben enviarse al cuadro de edición.

WM_IME_ENDCOMPOSITION

IMM envía un mensaje WM_IME_ENDCOMPOSITION a la aplicación cuando finaliza la operación de composición de IME. Esto puede ocurrir cuando el usuario presiona la tecla ENTRAR para aprobar la cadena de composición o la tecla ESC para cancelar la composición. CDXUTIMEEditBox controla este mensaje estableciendo que el búfer de cadena de composición esté vacío. A continuación, establece s_bHideCaret en FALSE porque la ventana de composición está cerrada y el cursor del cuadro de edición debería volver a estar visible.

El controlador de mensajes CDXUTIMEEditBox también establece s_bShowReadingWindow en FALSE. Esta marca controla si la clase dibuja la ventana de lectura cuando el cuadro de edición se representa, por lo que debe establecerse en FALSE cuando finaliza una composición.

WM_IME_NOTIFY

IMM envía un mensaje de WM_IME_NOTIFY a la aplicación cada vez que cambia una ventana de IME. Una aplicación que controla el dibujo de las ventanas IME debe procesar este mensaje para que sea consciente de cualquier actualización del contenido de la ventana. WParam indica el comando o el cambio que se está llevando a cabo. CDXUTIMEEditBox controla los siguientes comandos:

Comando IME Descripción
IMN_SETOPENSTATUS Este atributo contiene información como el estado de cada carácter de la cadena de composición (por ejemplo, convertido o no convertido). Esta información es necesaria porque CDXUTIMEEditBox colorea los caracteres de cadena de composición de forma diferente en función de sus atributos.
/ IMN_OPENCANDIDATE IMN_CHANGECANDIDATE Se envía a la aplicación cuando la ventana candidata está a punto de abrirse o actualizarse, respectivamente. Se abre la ventana candidata cuando un usuario desea cambiar la opción de texto convertida. La ventana se actualiza cuando un usuario mueve el indicador de selección o cambia la página. CDXUTIMEEditBox usa un controlador de mensajes para ambos comandos porque las tareas necesarias son exactamente las mismas:
  1. CDXUTIMEEditBox establece el miembro bShowWindow de la estructura de lista candidata s_CandList en TRUE para indicar que la ventana candidata debe dibujarse durante la representación de fotogramas.
  2. CDXUTIMEEditBox recupera la lista de candidatos llamando a ImmGetCandidateList, primero para obtener el tamaño de búfer necesario y, a continuación, de nuevo para obtener los datos reales.
  3. La estructura de la lista de candidatos privados s_CandList se inicializa con los datos de candidatos recuperados.
  4. Las cadenas candidatas se almacenan como una matriz de cadenas.
  5. El índice de la entrada seleccionada, así como el índice de página, se guarda.
  6. CDXUTIMEEditBox comprueba si el estilo de ventana candidata es vertical u horizontal. Si el estilo de ventana es horizontal, se debe inicializar un búfer de cadena adicional, el miembro HoriCand de s_CandList, con todas las cadenas candidatas, con caracteres de espacio insertados entre todas las cadenas adyacentes. Al representar una ventana candidata vertical, las cadenas candidatas individuales se dibujan de una en una, con las coordenadas y incrementadas para cada cadena. Sin embargo, esta cadena HoriCand se debe usar al representar una ventana candidata horizontal, ya que el carácter de espacio es la mejor manera de separar dos cadenas adyacentes en la misma línea.
IMN_CLOSECANDIDATE Se envía a la aplicación cuando una ventana candidata está a punto de cerrarse. Esto sucede cuando un usuario ha realizado una selección de la lista de candidatos. CDXUTIMEEditBox controla este comando estableciendo la marca visible de la ventana candidata en FALSE y, a continuación, borrando el búfer de cadenas candidatas.
IMN_PRIVATE Se envía a la aplicación cuando el IME ha actualizado su cadena de lectura como resultado de que el usuario escriba o quite caracteres. La aplicación debe recuperar la cadena de lectura y guardarla para su representación. CDXUTIMEEditBox tiene dos métodos para recuperar la cadena de lectura, en función de cómo se admiten las cadenas de lectura en el IME:
  • Si el IME admite la función GetReadingString, se llama a GetReadingString para recuperar la cadena de lectura.
  • Si el IME no implementa GetReadingString, CDXUTIMEEditBox recupera la cadena de lectura del contenido del contexto de entrada.

Representación

La representación de los elementos y ventanas de IME es sencilla. CDXUTIMEEditBox permite que la clase base se represente primero porque las ventanas IME deben aparecer encima del control de edición. Una vez representado el cuadro de edición base, CDXUTIMEEditBox comprueba la marca de visibilidad de cada ventana IME (indicador, composición, candidato y ventana de lectura) y dibuja la ventana si debe estar visible. Consulte Comportamiento predeterminado de IME para obtener descripciones de los diferentes tipos de ventana de IME.

Indicador de configuración regional de entrada

El indicador de configuración regional de entrada se representa antes de cualquier otra ventana IME porque es un elemento que siempre se muestra. Por lo tanto, debería aparecer debajo de otras ventanas IME. CDXUTIMEEditBox representa el indicador llamando al método RenderIndicator, en el que el color de fuente del indicador se determina examinando la variable estática s_ImeState, que refleja el modo de conversión IME actual. Cuando el IME está habilitado y la conversión nativa está activa, el método usa m_IndicatorImeColor como color del indicador. Si el IME está deshabilitado o está en modo de conversión no nativo, se usa m_IndicatorImeColor para dibujar el texto del indicador. De forma predeterminada, la propia ventana del indicador se dibuja a la derecha del cuadro de edición. Las aplicaciones pueden cambiar este comportamiento reemplazando el método RenderIndicator.

En la ilustración siguiente se muestran las diferentes apariencias de un indicador de configuración regional de entrada para inglés, japonés en modo de conversión alfanumérica y japonés en modo de conversión nativa:

diferentes apariencias de un indicador de configuración regional de entrada para inglés y japonés

Ventana composición

El dibujo de la ventana de composición se controla en el método RenderComposition de CDXUTIMEEditBox. La ventana de composición flota encima del cuadro de edición. Debe dibujarse en la posición del cursor del control de edición subyacente. CDXUTIMEEditBox controla la representación de la siguiente manera:

  1. Toda la cadena de composición se dibuja con los colores de cadena de composición predeterminados.
  2. Los caracteres con ciertos atributos especiales deben dibujarse en colores diferentes, por lo que CDXUTIMEEditBox revisa los caracteres de la cadena de composición e inspecciona el atributo string. Si el atributo llama a colores diferentes, el carácter se vuelve a dibujar con los colores adecuados.
  3. El cursor de la ventana de composición se dibuja para completar la representación.

El cursor debe parpadear para los IME coreanos, pero no para otros IME. RenderComposition determina si el cursor debe ser visible en función de los valores del temporizador cuando se usa el IME coreano.

Lectura y ventanas candidatas

Las ventanas de lectura y candidata se representan mediante el mismo método CDXUTIMEEditBox, RenderCandidateReadingWindow. Ambas ventanas contienen una matriz de cadenas para el diseño vertical o una sola cadena en el caso del diseño horizontal. La mayor parte del código de RenderCandidateReadingWindow se usa para colocar la ventana para que ninguna parte de la ventana se encuentre fuera de la ventana de la aplicación y se recorte.

Limitaciones

A veces, los IME contienen características avanzadas para mejorar la facilidad de entrada de texto. Algunas de las características que se encuentran en las imE más recientes se muestran en las cifras siguientes. Estas características avanzadas no están presentes en DXUT. La implementación de la compatibilidad con estas características avanzadas puede ser difícil porque no hay ninguna interfaz definida para obtener la información necesaria de los IME.

IME chino tradicional avanzado con lista de candidatos expandida:

ime tradicional tradicional avanzado con lista de candidatos expandidos

IME japonés avanzado con algunas entradas candidatas que contienen texto adicional para describir sus significados:

ime japonés avanzado con algunas entradas candidatas que contienen texto adicional para describir sus significados

IME coreano avanzado que incluye un sistema de reconocimiento de escritura a mano:

ime coreano avanzado que incluye un sistema de reconocimiento de escritura a mano

Información del Registro

Se comprueba la siguiente información del Registro para determinar la orientación de la ventana de lectura, cuando el IME actual es anterior CHT New Phonetic que no implementa GetReadingString().

Clave Value
HKCU\software\microsoft\windows\currentversion\IME_Name asignación de teclado

Donde: IME_Name es MSTCIPH si la versión del archivo IME es 5.1 o posterior; de lo contrario, IME_Name es TINTLGNT.

La orientación de la ventana de lectura es horizontal si:

  • El IME es la versión 5.0 y el valor de asignación de teclado es 0x22 o 0x23
  • El IME es la versión 5.1 o la versión 5.2 y el valor de asignación de teclado es 0x22, 0x23 o 0x24.

Si no se cumple ninguna condición, la ventana de lectura es vertical.

Apéndice A: Versiones de CHT por sistema operativo

Sistema operativo Versión de IME de CHT
Windows 98 4,2
Windows 2000 4.3
unknown 4.4.
Windows ME 5.0
Office XP 5,1
Windows XP 5.2
Descargable web independiente 6,0

Información adicional

Para obtener más información, consulte lo siguiente:

GetReadingString

Obtiene información de cadena de lectura.

Parámetros

himc

[in] Contexto de entrada.

uReadingBufLen

[in] Longitud de lpwReadingBuf, en WCHAR. Si es cero, significa la longitud del búfer de lectura de consultas.

lpwReadingBuf

[out] Devuelve una cadena de lectura (no un extremo cero).

pnErrorIndex

[out] Devuelve el índice de carácter de error en la cadena de lectura si existe.

pfIsVertical

[out] Si es TRUE, la lectura de la interfaz de usuario es vertical. De lo contrario, puMaxReadingLen horizontal.

puMaxReadingLen

[out] Longitud de la interfaz de usuario de lectura. La longitud máxima de lectura no es fija; depende no solo del diseño del teclado, sino también del modo de entrada (por ejemplo, código interno, entrada suplente).

Valores devueltos

Longitud de la cadena de lectura.

Comentarios:

Si el valor devuelto es mayor que el valor de uReadingBufLen, todos los parámetros de salida no están definidos.

Esta función se implementa en CHT IME 6.0 o posterior, y se puede adquirir mediante GetProcAddress en un identificador de módulo IME; El identificador del módulo IME se puede adquirir mediante ImmGetIMEFileName y LoadLibrary.

Requisitos

Rúbrica

Declarado en Imm.h.

Importar biblioteca

Use Imm.lib.

ShowReadingWindow

Mostrar (u ocultar) la ventana de lectura.

Parámetros

himc

[in] Contexto de entrada.

bShow

[in] Establezca en TRUE para mostrar la ventana de lectura (o FALSE para ocultarla).

Valores devueltos

Comentarios:

Devuelve TRUE si es correcto o FALSE si de lo contrario.

Requisitos

Rúbrica

Declarado en Imm.h.

Importar biblioteca

Use Imm.lib.