Share via


Verwenden eines Eingabemethoden-Editors in einem Spiel

Hinweis

In diesem Artikel wird die Arbeit mit dem Windows XP-Eingabemethoden-Editor (IME) erläutert. An der IME für Windows Vista wurden Änderungen vorgenommen, die in diesem Artikel nicht vollständig beschrieben sind. Weitere Informationen zu Änderungen am IME für Windows Vista finden Sie unter Eingabemethoden-Editoren (IME) in Windows Vista – An Ever-Expanding View of Internationalization on the Microsoft Global Development and Computing Portal.

Ein Eingabemethoden-Editor (IME) ist ein Programm, das die einfache Texteingabe über eine Standardtastat für ostasiatische Sprachen wie Chinesisch, Japanisch, Koreanisch und andere Sprachen mit komplexen Zeichen ermöglicht. Mit IMEs kann ein Benutzer beispielsweise komplexe Zeichen in einer Textverarbeitung eingeben, oder ein Spieler eines massiven Multiplayer-Onlinespiels kann mit Freunden in komplexen Charakteren chatten.

In diesem Artikel wird erläutert, wie Sie ein einfaches IME-Bearbeitungssteuerelement in einer Vollbildanwendung von Microsoft DirectX implementieren können. Anwendungen, die DXUT nutzen, erhalten automatisch IME-Funktionen. Für Anwendungen, die das Framework nicht nutzen, wird in diesem Artikel beschrieben, wie Sie einem Bearbeitungssteuerelement IME-Unterstützung hinzufügen.

Inhalte:

Standardverhalten im IME

IMEs ordnen Tastatureingaben phonetischen Komponenten oder anderen Sprachelementen zu, die für eine ausgewählte Sprache spezifisch sind. In einem typischen Szenario gibt der Benutzer Schlüssel ein, die die Aussprache eines komplexen Zeichens darstellen. Wenn die IME die Aussprache als gültig erkennt, präsentiert sie dem Benutzer eine Liste von Wort- oder Ausdruckskandidaten, aus denen der Benutzer eine endgültige Auswahl auswählen kann. Das ausgewählte Wort wird dann über eine Reihe von Microsoft Windows-WM_CHAR-Nachrichten an die Anwendung gesendet. Da der IME auf einer Ebene unterhalb der Anwendung funktioniert, indem Tastatureingaben abgefangen werden, ist das Vorhandensein eines IME für die Anwendung transparent. Fast alle Windows-Anwendungen können IMEs ohne Kenntnis ihrer Existenz und ohne spezielle Codierung nutzen.

Eine typische IME zeigt mehrere Fenster an, um den Benutzer durch die Zeicheneingabe zu führen, wie in den folgenden Beispielen gezeigt.

ime zeigt mehrere Fenster an

Fenstertyp BESCHREIBUNG IME-Ausgabe
A. Lesefenster Enthält Tastenanschläge von der Tastatur; ändert sich in der Regel nach jeder Tasteneingabe. Lesen von Zeichenfolgen
B. Kompositionsfenster Enthält die Auflistung von Zeichen, die der Benutzer mit der IME zusammengestellt hat. Diese Zeichen werden vom IME über der Anwendung gezeichnet. Wenn der Benutzer den IME benachrichtigt, dass die Kompositionszeichenfolge zufriedenstellend ist, sendet der IME die Kompositionszeichenfolge dann über eine Reihe von WM_CHAR Nachrichten an die Anwendung. Kompositionszeichenfolge
C. Kandidatenfenster Wenn der Benutzer eine gültige Aussprache eingegeben hat, zeigt die IME eine Liste der Kandidatenzeichen an, die alle mit der angegebenen Aussprache übereinstimmen. Der Benutzer wählt dann das gewünschte Zeichen aus dieser Liste aus, und der IME fügt dieses Zeichen der Anzeige des Kompositionsfensters hinzu. das nächste Zeichen in der Kompositionszeichenfolge
D: Indikator "Eingabegebietsschema " Zeigt die Sprache an, die der Benutzer für die Tastatureingabe ausgewählt hat. Dieser Indikator ist in die Windows-Taskleiste eingebettet. Die Eingabesprache kann ausgewählt werden, indem Sie die Systemsteuerung Regional- und Sprachoptionen öffnen und dann auf der Registerkarte Sprachen auf Details klicken. -

Verwenden von IMEs mit DXUT

In DXUT implementiert die CDXUTIMEEditBox-Klasse IME-Funktionalität. Diese Klasse wird von der CDXUTEditBox-Klasse abgeleitet, dem grundlegenden Bearbeitungssteuerelement, das vom Framework bereitgestellt wird. CDXUTIMEEditBox erweitert dieses Bearbeitungssteuerelement, um IMEs zu unterstützen, indem die CDXUTIMEEditBox-Methoden überschrieben werden. Die Klassen sind auf diese Weise konzipiert, um Entwicklern zu helfen, zu lernen, was sie aus dem Framework nehmen müssen, um DIE IME-Unterstützung in ihren eigenen Bearbeitungssteuerelementen zu implementieren. Im weiteren Verlauf dieses Themas wird erläutert, wie das Framework und insbesondere CDXUTIMEEditBox ein grundlegendes Bearbeitungssteuerelement außer Kraft setzt, um DIE IME-Funktionalität zu implementieren.

Die meisten IME-spezifischen Variablen in CDXUTIMEEditBox werden als statisch deklariert, da viele IME-Puffer und -Zustände prozessspezifisch sind. Für instance verfügt ein Prozess nur über einen Puffer für die Kompositionszeichenfolge. Auch wenn der Prozess über zehn Bearbeitungssteuerelemente verfügt, verwenden sie alle denselben Kompositionszeichenfolgenpuffer. Der Kompositionszeichenfolgenpuffer für CDXUTIMEEditBox ist daher statisch und verhindert, dass die Anwendung unnötigen Speicherplatz belegt.

CDXUTIMEEditBox ist im folgenden DXUT-Code implementiert:

(SDK-Stamm)\Samples\C++\Common\DXUTgui.cpp

Überschreiben des STANDARD-IME-Verhaltens

Normalerweise verwendet ein IME windows-Standardprozeduren zum Erstellen eines Fensters (siehe Verwenden von Windows). Unter normalen Umständen führt dies zu zufriedenstellenden Ergebnissen. Wenn die Anwendung jedoch im Vollbildmodus angezeigt wird, wie es bei Spielen üblich ist, funktionieren Standardfenster nicht mehr und werden möglicherweise nicht über der Anwendung angezeigt. Um dieses Problem zu beheben, muss die Anwendung die IME-Fenster selbst zeichnen, anstatt sich für diese Aufgabe auf Windows zu verlassen.

Wenn das Standardmäßige IME-Fenstererstellungsverhalten nicht das bereitstellt, was eine Anwendung benötigt, kann die Anwendung die IME-Fensterbehandlung außer Kraft setzen. Eine Anwendung kann dies erreichen, indem sie IME-bezogene Nachrichten verarbeitet und die IMM-API ( Input Method Manager ) aufruft.

Wenn ein Benutzer mit einer IME interagiert, um komplexe Zeichen einzugeben, sendet der IMM Nachrichten an die Anwendung, um sie über wichtige Ereignisse zu benachrichtigen, z. B. das Starten einer Komposition oder das Anzeigen des Kandidatenfensters. Eine Anwendung ignoriert diese Nachrichten in der Regel und übergibt sie an den Standardnachrichtenhandler, wodurch sie vom IME verarbeitet werden. Wenn die Anwendung anstelle des Standardhandlers die Nachrichten verarbeitet, steuert sie genau, was bei den einzelnen IME-Ereignissen geschieht. Häufig ruft der Nachrichtenhandler den Inhalt der verschiedenen IME-Fenster ab, indem er die IMM-API aufruft. Sobald die Anwendung über diese Informationen verfügt, kann sie die IME-Fenster ordnungsgemäß zeichnen, wenn sie auf der Anzeige gerendert werden muss.

Functions

Ein IME muss die Lesezeichenfolge abrufen, das Lesefenster ausblenden und die Ausrichtung des Lesefensters abrufen. Diese Tabelle zeigt die Funktionen pro IME-Version:

Abrufen von Lesezeichenfolgen Ausblenden des Lesefensters Ausrichtung des Lesefensters
Vor Version 6.0 A. Direktes Lesen von Window Access IME private Daten. Siehe "4-Struktur" Private IME-Nachrichten abfangen. Siehe "3 Nachrichten" Untersuchen Sie Registrierungsinformationen. Siehe "5 Registrierungsinformationen"
Nach Version 6.0 GetReadingString ShowReadingWindow GetReadingString

Nachrichten

Die folgenden Meldungen müssen nicht für neuere IME verarbeitet werden, die ShowReadingWindow() implementiert.

Die folgenden Nachrichten werden vom Anwendungsnachrichtenhandler erfasst (d. h. sie werden nicht an DefWindowProc übergeben), um zu verhindern, dass das Lesefenster angezeigt wird.

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)

Beispiele

Die folgenden Beispiele veranschaulichen, wie Sie Zeichenfolgeninformationen aus einem älteren IME abrufen, das nicht über GetReadingString() verfügt. Der Code generiert die folgenden Ausgaben:

Output BESCHREIBUNG
DWORD dwlen Länge der Lesezeichenfolge.
DWORD dwerr Index des Fehlerzeichens.
LPWSTR wstr Zeiger auf die Lesezeichenfolge.
BOOL-Unicode Wenn true, hat die Lesezeichenfolge das Unicode-Format. Andernfalls im Multibyteformat.

CHT IME Version 4.2, 4.3 und 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 Version 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 Version 5.1, 5.2 und CHS IME Version 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 Version 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 Version 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;

IME-Nachrichten

Eine Vollbildanwendung muss die folgenden IME-bezogenen Nachrichten ordnungsgemäß verarbeiten:

WM_INPUTLANGCHANGE

Der IMM sendet eine WM_INPUTLANGCHANGE Nachricht an das aktive Fenster einer Anwendung, nachdem das Eingabegebietsschema vom Benutzer mit einer Tastenkombination (normalerweise ALT+UMSCHALT) oder mit der Eingabegebietsanzeige auf der Taskleiste oder Sprachleiste geändert wurde. Die Sprachleiste ist ein Bildschirmsteuerelement, mit dem der Benutzer einen Textdienst konfigurieren kann. (Siehe Anzeigen der Sprachleiste.) Der folgende Screenshot zeigt eine Sprachauswahlliste, die angezeigt wird, wenn der Benutzer auf die Gebietsschemaanzeige klickt.

Sprachauswahlliste, die angezeigt wird, wenn der Benutzer auf den Gebietsschemaindikator klickt

Wenn der IMM eine WM_INPUTLANGCHANGE Nachricht sendet, muss CDXUTIMEEditBox mehrere wichtige Aufgaben ausführen:

  1. Die GetKeyboardLayout-Methode wird aufgerufen, um den Eingabegebietsschemabezeichner (ID) für den Anwendungsthread zurückzugeben. Die CDXUTIMEEditBox-Klasse speichert diese ID in ihrer statischen Membervariable s_hklCurrent zur späteren Verwendung. Es ist wichtig, dass die Anwendung das aktuelle Eingabegebietsschema kennt, da die IME für jede Sprache ein eigenes unterschiedliches Verhalten aufweist. Der Entwickler muss möglicherweise unterschiedliche Code für verschiedene Eingabegebietsschemas bereitstellen.
  2. CDXUTIMEEditBox initialisiert eine Zeichenfolge, die im Sprachindikator des Bearbeitungsfelds angezeigt werden soll. Dieser Indikator kann die aktive Eingabesprache anzeigen, wenn die Anwendung im Vollbildmodus ausgeführt wird und weder die Taskleiste noch die Sprachleiste sichtbar ist.
  3. Die ImmGetConversionStatus-Methode wird aufgerufen, um anzugeben, ob sich das Eingabegebietsschema im nativen oder nicht nativen Konvertierungsmodus befindet. Im nativen Konvertierungsmodus kann der Benutzer Text in der ausgewählten Sprache eingeben. Im nicht nativen Konvertierungsmodus fungiert die Tastatur als englische Standardtastatur. Es ist wichtig, dem Benutzer einen visuellen Hinweis zu geben, in welchem Konvertierungsmodus sich der IME befindet, damit der Benutzer leicht wissen kann, welche Zeichen beim Drücken einer Taste zu erwarten sind. CDXUTIMEEditBox stellt diesen visuellen Hinweis mit einer Sprachindikatorfarbe bereit. Wenn das Eingabegebietsschema einen IME mit nativem Konvertierungsmodus verwendet, zeichnet die CDXUTIMEEditBox-Klasse den Indikatortext mit der farbe, die durch den parameter m_IndicatorImeColor definiert wird. Wenn sich der IME im nicht nativen Konvertierungsmodus befindet oder überhaupt kein IME verwendet wird, zeichnet die Klasse den Indikatortext mit der farbe, die durch den parameter m_IndicatorEngColor definiert wird.
  4. CDXUTIMEEditBox überprüft das Eingabegebietsschema und legt die statische Membervariable s_bInsertOnType für Koreanisch auf TRUE und FALSE für alle anderen Sprachen fest. Dieses Flag ist aufgrund des unterschiedlichen Verhaltens koreanischer IMEs und aller anderen IMEs erforderlich. Bei der Eingabe von Zeichen in anderen Sprachen als Koreanisch wird der vom Benutzer eingegebene Text im Kompositionsfenster angezeigt, und der Benutzer kann den Inhalt der Kompositionszeichenfolge frei ändern. Der Benutzer drückt die EINGABETASTE, wenn er mit der Kompositionszeichenfolge zufrieden ist, und die Kompositionszeichenfolge wird als Eine Reihe von WM_CHAR Nachrichten an die Anwendung gesendet. Wenn ein Benutzer in koreanischen IMEs jedoch eine Taste drückt, um Text einzugeben, wird sofort ein Zeichen an die Anwendung gesendet. Wenn der Benutzer anschließend weitere Tasten drückt, um dieses Anfangszeichen zu ändern, ändert sich das Zeichen im Bearbeitungsfeld, um zusätzliche Eingaben des Benutzers widerzuspiegeln. Im Wesentlichen erstellt der Benutzer Zeichen im Bearbeitungsfeld. Diese beiden Verhaltensweisen sind so unterschiedlich, dass CDXUTIMEEditBox für jedes von ihnen speziell programmieren muss.
  5. Die statische Membermethode SetupImeApi wird aufgerufen, um Adressen von zwei Funktionen aus dem IME-Modul abzurufen: GetReadingString und ShowReadingWindow. Wenn diese Funktionen vorhanden sind, wird ShowReadingWindow aufgerufen, um das Standardlesefenster für diesen IME auszublenden. Da die Anwendung das Lesefenster selbst rendert, benachrichtigt sie den IME, das Zeichnen des Standardlesefensters zu deaktivieren, damit das Rendering im Vollbildmodus nicht beeinträchtigt wird.

Der IMM sendet eine WM_IME_SETCONTEXT Meldung, wenn ein Fenster der Anwendung aktiviert wird. Der lParam-Parameter dieser Meldung enthält ein Flag, das dem IME angibt, welche Fenster gezeichnet werden sollen und welche nicht. Da die Anwendung die gesamte Zeichnung verarbeitet, benötigt sie den IME nicht, um eines der IME-Fenster zu zeichnen. Daher legt der Nachrichtenhandler der Anwendung lParam einfach auf 0 fest und gibt zurück.

Damit Anwendungen IME unterstützen, ist eine spezielle Verarbeitung für die IME-bezogenen Nachrichten WM_IME_SETCONTEXT erforderlich. Da Windows diese Nachricht in der Regel vor dem Aufrufen der PanoramaInitialize()-Methode an die Anwendung sendet, hat Panorama keine Möglichkeit, die Benutzeroberfläche zum Anzeigen von Kandidatenlistenfenstern zu verarbeiten.

Der folgende Codeausschnitt gibt an, dass Windows-Anwendungen keine benutzeroberfläche anzeigen sollen, die dem Kandidatenlistenfenster zugeordnet ist, sodass Panorama diese Benutzeroberfläche speziell verarbeiten kann.

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

WM_IME_STARTCOMPOSITION

Der IMM sendet eine WM_IME_STARTCOMPOSITION Nachricht an die Anwendung, wenn eine IME-Komposition aufgrund von Tastatureingaben des Benutzers gestartet wird. Wenn der IME das Kompositionsfenster verwendet, wird die aktuelle Kompositionszeichenfolge in einem Kompositionsfenster angezeigt. CDXUTIMEEditBox verarbeitet diese Nachricht, indem zwei Aufgaben ausgeführt werden:

  1. CDXUTIMEEditBox löscht den Kompositionszeichenfolgenpuffer und den Attributpuffer. Diese Puffer sind statische Member von CDXUTIMEEditBox.
  2. CDXUTIMEEditBox legt die s_bHideCaret statische Membervariable auf TRUE fest. Dieser Member, der in der CDXUTEditBox-Basisklasse definiert ist, steuert, ob der Cursor im Bearbeitungsfeld gezeichnet werden soll, wenn das Bearbeitungsfeld gerendert wird. Das Kompositionsfenster funktioniert ähnlich wie ein Bearbeitungsfeld mit Text und Cursor. Um Verwechslungen zu vermeiden, wenn das Kompositionsfenster sichtbar ist, blendet das Bearbeitungsfeld den Cursor aus, sodass jeweils nur ein Cursor sichtbar ist.

WM_IME_COMPOSITION

Der IMM sendet eine WM_IME_COMPOSITION-Nachricht an die Anwendung, wenn der Benutzer eine Tastatureingabe eingibt, um die Kompositionszeichenfolge zu ändern. Der Wert von lParam gibt an, welche Art von Informationen die Anwendung aus dem Eingabemethoden-Manager (IMM) abrufen kann. Die Anwendung sollte die verfügbaren Informationen durch Aufrufen von ImmGetCompositionString abrufen und die Informationen dann in ihrem privaten Puffer speichern, damit die IME-Elemente später gerendert werden können.

CDXUTIMEEditBox überprüft die folgenden Kompositionszeichenfolgendaten und ruft sie ab:

WM_IME_COMPOSITION lParam Flag Value Daten BESCHREIBUNG
GCS_COMPATTR Composition-Attribut Dieses Attribut enthält Informationen wie die status jedes Zeichens in der Kompositionszeichenfolge (z. B. konvertiert oder nicht konvertiert). Diese Informationen sind erforderlich, da CDXUTIMEEditBox die Kompositionszeichenfolgenzeichen basierend auf ihren Attributen unterschiedlich farbt.
GCS_COMPCLAUSE Informationen zur Composition-Klausel Diese Klauselinformationen werden verwendet, wenn der japanische IME aktiv ist. Wenn eine japanische Kompositionszeichenfolge konvertiert wird, können Zeichen als Klausel gruppiert werden, die in eine einzelne Entität konvertiert wird. Wenn der Benutzer den Cursor verschiebt, verwendet CDXUTIMEEditBox diese Informationen, um die gesamte Klausel hervorzuheben, anstatt nur ein einzelnes Zeichen in der -Klausel.
GCS_COMPSTR Kompositionszeichenfolge Diese Zeichenfolge ist die aktuelle Zeichenfolge, die vom Benutzer erstellt wird. Dies ist auch die Zeichenfolge, die im Kompositionsfenster angezeigt wird.
GCS_CURSORPOS Kompositionscursorposition Das Kompositionsfenster implementiert einen Cursor, ähnlich dem Cursor in einem Bearbeitungsfeld. Die Anwendung kann die Cursorposition beim Verarbeiten der WM_IME_COMPOSITION-Nachricht abrufen, um den Cursor ordnungsgemäß zu zeichnen.
GCS_RESULTSTR Ergebniszeichenfolge Die Ergebniszeichenfolge ist verfügbar, wenn der Benutzer gerade dabei ist, den Kompositionsprozess abzuschließen. Diese Zeichenfolge sollte abgerufen werden, und die Zeichen sollten an das Bearbeitungsfeld gesendet werden.

WM_IME_ENDCOMPOSITION

Der IMM sendet eine WM_IME_ENDCOMPOSITION Nachricht an die Anwendung, wenn der IME-Kompositionsvorgang beendet wird. Dies kann auftreten, wenn der Benutzer die EINGABETASTE drückt, um die Kompositionszeichenfolge zu genehmigen, oder die ESC-Taste, um die Komposition abzubrechen. CDXUTIMEEditBox verarbeitet diese Nachricht, indem der Kompositionszeichenfolgenpuffer auf leer festgelegt wird. Anschließend wird s_bHideCaret auf FALSE festgelegt, da das Kompositionsfenster geschlossen ist und der Cursor im Bearbeitungsfeld wieder sichtbar sein soll.

Der CDXUTIMEEditBox-Nachrichtenhandler legt auch s_bShowReadingWindow auf FALSE fest. Dieses Flag steuert, ob die Klasse das Lesefenster zeichnet, wenn das Bearbeitungsfeld sich selbst rendert. Daher muss es auf FALSE festgelegt werden, wenn eine Komposition endet.

WM_IME_NOTIFY

Der IMM sendet eine WM_IME_NOTIFY-Nachricht an die Anwendung, wenn sich ein IME-Fenster ändert. Eine Anwendung, die das Zeichnen der IME-Fenster verarbeitet, sollte diese Nachricht verarbeiten, damit sie über alle Aktualisierungen des Fensterinhalts informiert ist. Der wParam gibt den Befehl oder die Vorgenommene Änderung an. CDXUTIMEEditBox verarbeitet die folgenden Befehle:

IME-Befehl BESCHREIBUNG
IMN_SETOPENSTATUS Dieses Attribut enthält Informationen wie die status jedes Zeichens in der Kompositionszeichenfolge (z. B. konvertiert oder nicht konvertiert). Diese Informationen sind erforderlich, da CDXUTIMEEditBox die Kompositionszeichenfolgenzeichen basierend auf ihren Attributen unterschiedlich farbt.
/ IMN_OPENCANDIDATE IMN_CHANGECANDIDATE Wird an die Anwendung gesendet, wenn das Kandidatenfenster geöffnet oder aktualisiert werden soll. Das Kandidatenfenster wird geöffnet, wenn ein Benutzer die konvertierte Textauswahl ändern möchte. Das Fenster wird aktualisiert, wenn ein Benutzer den Auswahlindikator verschiebt oder die Seite ändert. CDXUTIMEEditBox verwendet einen Nachrichtenhandler für beide Befehle, da die erforderlichen Aufgaben genau identisch sind:
  1. CDXUTIMEEditBox legt das bShowWindow-Element der Kandidatenlistenstruktur s_CandList auf TRUE fest, um anzugeben, dass das Kandidatenfenster während des Framerenderings gezeichnet werden muss.
  2. CDXUTIMEEditBox ruft die Kandidatenliste durch Aufrufen von ImmGetCandidateList ab, um zuerst die erforderliche Puffergröße abzurufen, und dann erneut, um die tatsächlichen Daten abzurufen.
  3. Die private Kandidatenlistenstruktur s_CandList wird mit den abgerufenen Kandidatendaten initialisiert.
  4. Die Kandidatenzeichenfolgen werden als Array von Zeichenfolgen gespeichert.
  5. Der Index des ausgewählten Eintrags sowie der Seitenindex werden gespeichert.
  6. CDXUTIMEEditBox überprüft, ob das Format des Kandidatenfensters vertikal oder horizontal ist. Wenn das Fensterformat horizontal ist, muss ein zusätzlicher Zeichenfolgenpuffer, der HoriCand-Member von s_CandList, mit allen Kandidatenzeichenfolgen initialisiert werden, wobei Leerzeichen zwischen allen angrenzenden Zeichenfolgen eingefügt werden. Beim Rendern eines vertikalen Kandidatenfensters werden die einzelnen Kandidatenzeichenfolgen einzeln gezeichnet, wobei die y-Koordinaten für jede Zeichenfolge inkrementiert werden. Diese HoriCand-Zeichenfolge sollte jedoch beim Rendern eines horizontalen Kandidatenfensters verwendet werden, da das Leerzeichen die beste Möglichkeit ist, zwei benachbarte Zeichenfolgen in derselben Zeile zu trennen.
IMN_CLOSECANDIDATE Wird an die Anwendung gesendet, wenn ein Kandidatenfenster geschlossen wird. Dies geschieht, wenn ein Benutzer eine Auswahl aus der Kandidatenliste getroffen hat. CDXUTIMEEditBox verarbeitet diesen Befehl, indem das sichtbare Flag des Kandidatenfensters auf FALSE festgelegt und dann der Kandidatenzeichenfolgenpuffer gelöscht wird.
IMN_PRIVATE Wird an die Anwendung gesendet, wenn der IME seine Lesezeichenfolge aktualisiert hat, weil der Benutzer Zeichen eingegeben oder entfernt hat. Die Anwendung sollte die Lesezeichenfolge abrufen und zum Rendern speichern. CDXUTIMEEditBox verfügt über zwei Methoden zum Abrufen der Lesezeichenfolge, basierend darauf, wie Lesezeichenfolgen im IME unterstützt werden:
  • Wenn der IME die GetReadingString-Funktion unterstützt, wird GetReadingString aufgerufen, um die Lesezeichenfolge abzurufen.
  • Wenn die IME GetReadingString nicht implementiert, ruft CDXUTIMEEditBox die Lesezeichenfolge aus dem Eingabekontextinhalt ab.

Darstellung

Das Rendern der IME-Elemente und -Fenster ist einfach. CDXUTIMEEditBox lässt die Basisklasse zuerst rendern, da IME-Fenster über dem Bearbeitungssteuerelement angezeigt werden sollen. Nachdem das Basisbearbeitungsfeld gerendert wurde, überprüft CDXUTIMEEditBox das Sichtbarkeitsflag jedes IME-Fensters (Indikator, Komposition, Kandidat und Lesefenster) und zeichnet das Fenster, falls es sichtbar sein soll. Beschreibungen der verschiedenen IME-Fenstertypen finden Sie unter Standard-IME-Verhalten.

Eingabegebietsindikator

Der Eingabegebietsschemaindikator wird vor allen anderen IME-Fenstern gerendert, da es sich um ein Element handelt, das immer angezeigt wird. Es sollte daher unter anderen IME-Fenstern angezeigt werden. CDXUTIMEEditBox rendert den Indikator durch Aufrufen der RenderIndicator-Methode, bei der die Schriftfarbe des Indikators durch Untersuchen der s_ImeState statischen Variablen bestimmt wird, die den aktuellen IME-Konvertierungsmodus widerspiegelt. Wenn die IME aktiviert ist und die native Konvertierung aktiv ist, verwendet die Methode m_IndicatorImeColor als Indikatorfarbe. Wenn die IME deaktiviert ist oder sich im nicht nativen Konvertierungsmodus befindet, wird m_IndicatorImeColor verwendet, um den Indikatortext zu zeichnen. Standardmäßig wird das Indikatorfenster selbst rechts neben dem Bearbeitungsfeld gezeichnet. Anwendungen können dieses Verhalten ändern, indem sie die RenderIndicator-Methode überschreiben.

Die folgende Abbildung zeigt die verschiedenen Darstellungen eines Eingabegebietsindikators für Englisch, Japanisch im alphanumerischen Konvertierungsmodus und Japanisch im nativen Konvertierungsmodus:

unterschiedliche Darstellungen eines Eingabegebietsindikators für Englisch und Japanisch

Kompositionsfenster

Die Zeichnung des Kompositionsfensters wird in der RenderComposition-Methode von CDXUTIMEEditBox behandelt. Das Kompositionsfenster befindet sich über dem Bearbeitungsfeld. Es sollte an der Cursorposition des zugrunde liegenden Bearbeitungssteuerelements gezeichnet werden. CDXUTIMEEditBox verarbeitet das Rendering wie folgt:

  1. Die gesamte Kompositionszeichenfolge wird mit den Standardfarben der Kompositionszeichenfolge gezeichnet.
  2. Zeichen mit bestimmten besonderen Attributen sollten in unterschiedlichen Farben gezeichnet werden. Daher überprüft CDXUTIMEEditBox die Zeichen der Kompositionszeichenfolge und überprüft das Zeichenfolgenattribute. Wenn das Attribut verschiedene Farben aufruft, wird das Zeichen erneut mit den entsprechenden Farben gezeichnet.
  3. Der Cursor des Kompositionsfensters wird gezeichnet, um das Rendering abzuschließen.

Der Cursor sollte für koreanische IMEs blinken, aber nicht für andere IMEs. RenderComposition bestimmt, ob der Cursor sichtbar sein soll, basierend auf Timerwerten, wenn der koreanische IME verwendet wird.

Lese- und Kandidatenfenster

Die Lese- und Kandidatenfenster werden von derselben CDXUTIMEEditBox-Methode gerendert, RenderCandidateReadingWindow. Beide Fenster enthalten ein Array von Zeichenfolgen für das vertikale Layout oder eine einzelne Zeichenfolge im Fall eines horizontalen Layouts. Der Großteil des Codes in RenderCandidateReadingWindow wird verwendet, um das Fenster so zu positionieren, dass kein Teil des Fensters außerhalb des Anwendungsfensters liegt und abgeschnitten wird.

Einschränkungen

IMEs enthalten manchmal erweiterte Funktionen, um die Eingabe von Text zu verbessern. Einige der Features in neueren IMEs sind in den folgenden Abbildungen dargestellt. Diese erweiterten Features sind in DXUT nicht vorhanden. Die Implementierung der Unterstützung für diese erweiterten Features kann schwierig sein, da keine Schnittstelle definiert ist, um die erforderlichen Informationen aus den IMEs abzurufen.

Erweiterte traditionelle chinesische IME mit erweiterter Kandidatenliste:

erweiterte traditionelle chinesische Ime mit erweiterter Kandidatenliste

Erweiterte japanische IME mit einigen Kandidateneinträgen, die zusätzlichen Text enthalten, um ihre Bedeutung zu beschreiben:

erweiterte japanische ime mit einigen Kandidateneinträgen, die zusätzlichen Text enthalten, um ihre Bedeutung zu beschreiben

Erweiterte koreanische IME, die ein Handschrifterkennungssystem enthält:

erweiterte koreanische Ime, die ein Handschrifterkennungssystem enthält

Registrierungsinformationen

Die folgenden Registrierungsinformationen werden überprüft, um die Ausrichtung des Lesefensters zu bestimmen, wenn die aktuelle IME ältere CHT New Phonetic ist, die GetReadingString() nicht implementiert.

Schlüssel Wert
HKCU\software\microsoft\windows\currentversion\IME_Name Tastaturzuordnung

Dabei gilt: IME_Name ist MSTCIPH, wenn die IME-Dateiversion 5.1 oder höher ist; andernfalls ist IME_Name TINTLGNT.

Die Ausrichtung des Lesefensters ist horizontal, wenn:

  • Der IME ist Version 5.0, und der Tastaturzuordnungswert ist 0x22 oder 0x23
  • Der IME ist Version 5.1 oder Version 5.2, und der Tastaturzuordnungswert ist 0x22, 0x23 oder 0x24.

Wenn keine bedingung erfüllt ist, ist das Lesefenster vertikal.

Anhang A: CHT-Versionen pro Betriebssystem

Betriebssystem CHT IME-Version
Windows 98 4,2
Windows 2000 4.3
unknown 4.4
Windows ME 5.0
Office XP 5,1
Windows XP 5,2
Eigenständiger Webdownloadble 6.0

Weitere Informationen

Zusätzliche Informationen finden Sie unter:

GetReadingString

Ruft Zeichenfolgeninformationen zum Lesen ab.

Parameter

himc

[in] Eingabekontext.

uReadingBufLen

[in] Länge von lpwReadingBuf in WCHAR. Wenn es null ist, bedeutet dies, dass die Pufferlänge der Abfrage gelesen wird.

lpwReadingBuf

[out] Zurückgeben einer Lesezeichenfolge (nicht null Ende).

pnErrorIndex

[out] Gibt den Index des Fehlerzeichens in der Lesezeichenfolge zurück, falls vorhanden.

pfIsVertical

[out] Wenn der Wert TRUE ist, ist das Lesen der Benutzeroberfläche vertikal. Andernfalls horizontal puMaxReadingLen.

puMaxReadingLen

[out] Die Länge der Lese-UI. Die maximale Leselänge ist nicht festgelegt. dies hängt nicht nur vom Tastaturlayout ab, sondern auch vom Eingabemodus (z. B. interner Code, Ersatzeingabe).

Rückgabewerte

Die Länge der Lesezeichenfolge.

Anmerkungen

Wenn der Rückgabewert größer als der Wert von uReadingBufLen ist, sind alle Ausgabeparameter nicht definiert.

Diese Funktion ist in CHT IME 6.0 oder höher implementiert und kann von GetProcAddress auf einem IME-Modulhandle abgerufen werden. das IME-Modulhandle kann von ImmGetIMEFileName und LoadLibrary abgerufen werden.

Anforderungen

Header

Deklariert in Imm.h.

Bibliothek importieren

Verwenden Sie Imm.lib.

ShowReadingWindow

Anzeigen (oder Ausblenden) des Lesefensters

Parameter

himc

[in] Eingabekontext.

bShow

[in] Legen Sie auf TRUE fest, um das Lesefenster anzuzeigen (oder FALSE, um es auszublenden).

Rückgabewerte

Anmerkungen

Gibt TRUE zurück, wenn erfolgreich, oder FALSE, wenn andernfalls.

Anforderungen

Header

Deklariert in Imm.h.

Bibliothek importieren

Verwenden Sie Imm.lib.