ゲームでの入力メソッド エディターの使用

注意

この記事では、Windows XP 入力メソッド エディター (IME) の操作について詳しく説明します。 この記事では詳しく説明されていない Windows Vista 用 IME に変更が加えられました。 Windows Vista 用 IME の変更の詳細については、Microsoft グローバル開発およびコンピューティング ポータルの「Windows Vista の 入力メソッド エディター (IME)- 国際化のEver-Expandingビュー 」を参照してください。

入力メソッド エディター (IME) は、中国語、日本語、韓国語、複雑な文字を含む他の言語など、東アジア言語の標準キーボードを使用して簡単にテキストを入力できるプログラムです。 たとえば、IME を使用すると、ユーザーはワード プロセッサに複雑な文字を入力したり、大規模なマルチプレイヤー オンライン ゲームのプレーヤーが複雑な文字で友人とチャットしたりできます。

この記事では、全画面表示の Microsoft DirectX アプリケーションで基本的な IME 編集コントロールを実装する方法について説明します。 DXUT を利用するアプリケーションでは、IME 機能が自動的に取得されます。 フレームワークを使用しないアプリケーションの場合、この記事では編集コントロールに IME サポートを追加する方法について説明します。

コンテンツ:

既定の IME 動作

IME は、キーボード入力を、選択した言語に固有のふりがなコンポーネントまたはその他の言語要素にマップします。 一般的なシナリオでは、ユーザーは複雑な文字の発音を表すキーを入力します。 IME が発音を有効と認識すると、ユーザーが最終的な選択肢を選択できる単語または語句の候補の一覧がユーザーに表示されます。 選択した単語は、一連の Microsoft Windows WM_CHAR メッセージを介してアプリケーション 送信されます。 IME はキーボード入力をインターセプトしてアプリケーションより下のレベルで動作するため、IME の存在はアプリケーションに対して透過的です。 ほぼすべての Windows アプリケーションは、その存在を認識することなく、特別なコーディングを必要とせずに、IME を簡単に利用できます。

一般的な IME には、次の例に示すように、ユーザーが文字入力をガイドするいくつかのウィンドウが表示されます。

ime に複数のウィンドウが表示される

ウィンドウの種類 説明 IME 出力
A. 閲覧ウィンドウ キーボードからのキーストロークが含まれています。通常、各キーストロークの後に変更されます。 文字列の読み取り
B. コンポジション ウィンドウ ユーザーが IME で構成した文字のコレクションを格納します。 これらの文字は、アプリケーション上の IME によって描画されます。 ユーザーがコンポジション文字列が十分であることを IME に通知すると、IME は一連のWM_CHAR メッセージを介してコンポジション文字列をアプリケーションに送信します。 composition string
C. 候補ウィンドウ ユーザーが有効な発音を入力すると、IME には、指定された発音とすべて一致する候補文字の一覧が表示されます。 次に、ユーザーがこの一覧から目的の文字を選択すると、IME によってこの文字が [コンポジション ウィンドウ] 画面に追加されます。 コンポジション文字列の次の文字
D. 入力ロケール インジケーター ユーザーがキーボード入力用に選択した言語を示します。 このインジケーターは、Windows タスク バーに埋め込まれています。 入力言語を選択するには、[地域と言語のオプション] コントロール パネルを開き、[言語] タブの [詳細] をクリックします。 -

DXUT での IME の使用

DXUT では、CDXUTIMEEditBox クラスは IME 機能を実装します。 このクラスは、フレームワークによって提供される基本的な編集コントロールである CDXUTEditBox クラスから派生します。 CDXUTIMEEditBox は、CDXUTIMEEditBox メソッドをオーバーライドすることで、その編集コントロールを拡張して IME をサポートします。 このクラスは、開発者が独自の編集コントロールに IME サポートを実装するためにフレームワークから何を取る必要があるかを学習できるように設計されています。 このトピックの残りの部分では、フレームワークと CDXUTIMEEditBox が基本的な編集コントロールをオーバーライドして IME 機能を実装する方法について説明します。

CDXUTIMEEditBox の IME 固有の変数のほとんどは静的として宣言されています。多くの IME バッファーと状態はプロセスに固有であるためです。 たとえば、プロセスに含まれるコンポジション文字列のバッファーは 1 つだけです。 プロセスに 10 個の編集コントロールがある場合でも、それらはすべて同じコンポジション文字列バッファーを共有します。 したがって、CDXUTIMEEditBox のコンポジション文字列バッファーは静的であるため、アプリケーションが不要なメモリ領域を占有できなくなります。

CDXUTIMEEditBox は、次の DXUT コードで実装されます。

(SDK ルート)\Samples\C++\Common\DXUTgui.cpp

既定の IME 動作のオーバーライド

通常、IME は標準の Windows プロシージャを使用してウィンドウを作成します (「 Windows の使用」を参照)。 通常の状況では、満足のいく結果が得られます。 ただし、ゲームの場合と同様に、アプリケーションが全画面表示モードで表示される場合、標準ウィンドウは機能しなくなり、アプリケーションの上部に表示されないことがあります。 この問題を解決するには、このタスクを実行するために Windows に依存するのではなく、アプリケーションで IME ウィンドウ自体を描画する必要があります。

既定の IME ウィンドウ作成動作でアプリケーションに必要なものが提供されない場合、アプリケーションは IME ウィンドウの処理をオーバーライドできます。 アプリケーションでは、IME 関連のメッセージを処理し、 入力メソッド マネージャー (IMM) API を呼び出すことでこれを実現できます。

ユーザーが IME と対話して複雑な文字を入力すると、IMM はアプリケーションにメッセージを送信して、コンポジションの開始や候補ウィンドウの表示などの重要なイベントを通知します。 通常、アプリケーションはこれらのメッセージを無視し、既定のメッセージ ハンドラーに渡します。これにより、IME によってメッセージが処理されます。 アプリケーションは、既定のハンドラーではなく、メッセージを処理するときに、各 IME イベントでの動作を正確に制御します。 多くの場合、メッセージ ハンドラーは IMM API を呼び出してさまざまな IME ウィンドウの内容を取得します。 アプリケーションがこの情報を取得すると、ディスプレイにレンダリングする必要があるときに IME ウィンドウ自体を適切に描画できます。

関数

IME では、読み取り文字列を取得し、読み取りウィンドウを非表示にし、読み取りウィンドウの向きを取得する必要があります。 次の表に、IME バージョンごとの機能を示します。

文字列の読み取りを取得する 閲覧ウィンドウを非表示にする 閲覧ウィンドウの向き
バージョン 6.0 より前 A. ウィンドウ アクセス IME プライベート データを直接読み取ります。 「4つの構造」を参照 IME プライベート メッセージをトラップします。 「3 つのメッセージ」を参照してください レジストリ情報を調べます。 「5 レジストリ情報」を参照してください
バージョン 6.0 以降 GetReadingString ShowReadingWindow GetReadingString

メッセージ

ShowReadingWindow() を実装する新しい IME では、次のメッセージを処理する必要はありません。

次のメッセージは、読み取りウィンドウが表示されないように、アプリケーション メッセージ ハンドラーによってトラップされます (つまり、DefWindowProc に渡されません)。

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)

次の例は、GetReadingString() を持たない古い IME から文字列情報を読み取る方法を示しています。 このコードでは、次の出力が生成されます。

出力 説明
DWORD dwlen 読み取り文字列の長さ。
DWORD dwerr エラー文字のインデックス。
LPWSTR wstr 読み取り文字列へのポインター。
BOOL Unicode true の場合、読み取り文字列は Unicode 形式です。 それ以外の場合はマルチバイト形式です。

CHT IME バージョン 4.2、4.3、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 バージョン 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 バージョン 5.1、5.2、CHS IME バージョン 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 バージョン 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 バージョン 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 メッセージ

全画面表示アプリケーションは、次の IME 関連のメッセージを適切に処理する必要があります。

WM_INPUTLANGCHANGE

IMM は、キーの組み合わせ (通常は Alt + Shift) を使用してユーザーが入力ロケールを変更した後、またはタスク バーまたは言語バーの入力ロケール インジケーターを使用して、アプリケーションのアクティブウィンドウにWM_INPUTLANGCHANGEメッセージを送信します。 言語バーは、ユーザーがテキスト サービスを構成できる画面上のコントロールです。 ( 言語バーを表示する方法に関するページを参照してください)。次のスクリーン ショットは、ユーザーがロケール インジケーターをクリックしたときに表示される言語選択リストを示しています。

ユーザーがロケール インジケーターをクリックしたときに表示される言語選択リスト

IMM がWM_INPUTLANGCHANGE メッセージを送信する場合、CDXUTIMEEditBox はいくつかの重要なタスクを実行する必要があります。

  1. GetKeyboardLayout メソッドは、アプリケーション スレッドの入力ロケール識別子 (ID) を返すために呼び出されます。 CDXUTIMEEditBox クラスは、後で使用するために、この ID を静的メンバー変数s_hklCurrentに保存します。 各言語の IME には独自の動作があるため、アプリケーションで現在の入力ロケールを認識することが重要です。 開発者は、入力ロケールごとに異なるコードを提供する必要がある場合があります。
  2. CDXUTIMEEditBox は、編集ボックスの言語インジケーターに表示する文字列を初期化します。 このインジケーターは、アプリケーションが全画面表示モードで実行されていて、タスク バーも言語バーも表示されない場合に、アクティブな入力言語を表示できます。
  3. ImmGetConversionStatus メソッドは、入力ロケールがネイティブ変換モードか非ネイティブ変換モードかを示すために呼び出されます。 ネイティブ変換モードでは、ユーザーは選択した言語でテキストを入力できます。 非ネイティブ変換モードでは、キーボードが標準の英語キーボードとして機能します。 ユーザーがキーを押したときに予想される文字を簡単に把握できるように、IME が使用されている変換モードの種類に関する視覚的な手掛かりをユーザーに提供することが重要です。 CDXUTIMEEditBox は、この視覚的な手掛かりに言語インジケーターの色を提供します。 入力ロケールでネイティブ変換モードの IME を使用する場合、CDXUTIMEEditBox クラスは、m_IndicatorImeColor パラメーターによって定義された色でインジケーター テキストを描画します。 IME が非ネイティブ変換モードの場合、または IME がまったく使用されていない場合、クラスは、m_IndicatorEngColor パラメーターによって定義された色でインジケーター テキストを描画します。
  4. CDXUTIMEEditBox は入力ロケールをチェックし、その他のすべての言語の場合は韓国語と FALSE の場合は、静的メンバー変数 s_bInsertOnTypeを TRUE に設定します。 このフラグは、韓国語 IME と他のすべての IME の動作が異なるために必要です。 韓国語以外の言語で文字を入力すると、ユーザーが入力したテキストがコンポジション ウィンドウに表示され、ユーザーはコンポジション文字列の内容を自由に変更できます。 ユーザーは、コンポジション文字列に問題がなければ Enter キーを押し、コンポジション文字列は一連のWM_CHAR メッセージとしてアプリケーションに送信されます。 ただし、韓国語 IME では、ユーザーがキーを押してテキストを入力すると、すぐに文字がアプリケーションに送信されます。 その後、ユーザーがその初期文字を変更するためにさらに多くのキーを押すと、編集ボックス内の文字が変更され、ユーザーからの追加の入力が反映されます。 基本的に、ユーザーは編集ボックスで文字を作成しています。 これら 2 つの動作は、CDXUTIMEEditBox でそれぞれを具体的にコーディングする必要があるほど異なります。
  5. 静的メンバー メソッド SetupImeApi は、IME モジュールから 2 つの関数のアドレスを取得するために呼び出されます。GetReadingString と ShowReadingWindow。 これらの関数が存在する場合は、ShowReadingWindow が呼び出され、この IME の既定の読み取りウィンドウが非表示になります。 アプリケーションは読み取りウィンドウ自体をレンダリングするため、全画面表示のレンダリングに干渉しないように、既定の読み取りウィンドウの描画を無効にするように IME に通知します。

IMM は、アプリケーションのウィンドウがアクティブになると、WM_IME_SETCONTEXTメッセージを送信します。 このメッセージの lParam パラメーターには、描画するウィンドウと描画しないウィンドウを IME に示すフラグが含まれています。 アプリケーションはすべての図面を処理しているため、IME ウィンドウを描画するために IME は必要ありません。 したがって、アプリケーションのメッセージ ハンドラーは、単に lParam を 0 に設定し、 を返します。

アプリケーションで IME をサポートするには、IME 関連のメッセージ WM_IME_SETCONTEXTに特別な処理が必要です。 通常、Windows は PanoramaInitialize() メソッドを呼び出す前にこのメッセージをアプリケーションに送信するため、Panorama には候補リスト ウィンドウを表示するための UI を処理する機会がありません。

次のコード スニペットでは、候補リスト ウィンドウに関連付けられている UI を Windows アプリケーションに表示しないように指定しています。これにより、Panorama はこの UI を特に処理できます。

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

WM_IME_STARTCOMPOSITION

IMM は、ユーザーによるキーストロークの結果として IME コンポジションが開始されようとしているときに、WM_IME_STARTCOMPOSITION メッセージをアプリケーションに送信します。 IME でコンポジション ウィンドウが使用されている場合は、コンポジション ウィンドウに現在のコンポジション文字列が表示されます。 CDXUTIMEEditBox は、次の 2 つのタスクを実行してこのメッセージを処理します。

  1. CDXUTIMEEditBox は、コンポジション文字列バッファーと属性バッファーをクリアします。 これらのバッファーは、CDXUTIMEEditBox の静的メンバーです。
  2. CDXUTIMEEditBox は、s_bHideCaret静的メンバー変数を TRUE に設定します。 このメンバーは、基本 CDXUTEditBox クラスで定義され、編集ボックスのレンダリング時に編集ボックス内のカーソルを描画するかどうかを制御します。 コンポジション ウィンドウは、テキストとカーソルを含む編集ボックスと同様に機能します。 コンポジション ウィンドウが表示されているときに混乱を避けるために、編集ボックスはカーソルを非表示にして、一度に 1 つのカーソルのみが表示されるようにします。

WM_IME_COMPOSITION

IMM は、ユーザーがキーストロークを入力してコンポジション文字列を変更すると、アプリケーションにWM_IME_COMPOSITIONメッセージを送信します。 lParam の値は、アプリケーションが Input Method Manager (IMM) から取得できる情報の種類を示します。 アプリケーションでは 、ImmGetCompositionString を呼び出して使用可能な情報を取得し、その情報をプライベート バッファーに保存して、後で IME 要素をレンダリングできるようにする必要があります。

CDXUTIMEEditBox は、次のコンポジション文字列データをチェックして取得します。

WM_IME_COMPOSITION lParam フラグ値 Data 説明
GCS_COMPATTR Composition 属性 この属性には、コンポジション文字列内の各文字の状態 (たとえば、変換された文字や変換されていない文字) などの情報が含まれます。 CDXUTIMEEditBox は、コンポジション文字列の文字を属性に基づいて異なる方法で色分けするため、この情報が必要です。
GCS_COMPCLAUSE Composition 句の情報 この句情報は、日本語 IME がアクティブな場合に使用されます。 日本語のコンポジション文字列を変換すると、1 つのエンティティに変換される句として文字をグループ化できます。 ユーザーがカーソルを移動すると、CDXUTIMEEditBox では、句内の 1 文字ではなく、この情報を使用して句全体が強調表示されます。
GCS_COMPSTR コンポジション文字列 この文字列は、ユーザーによって構成されている最新の文字列です。 これは、コンポジション ウィンドウに表示される文字列でもあります。
GCS_CURSORPOS コンポジション カーソル位置 コンポジション ウィンドウは、編集ボックス内のカーソルと同様にカーソルを実装します。 アプリケーションは、カーソルを適切に描画するために、WM_IME_COMPOSITION メッセージを処理するときにカーソル位置を取得できます。
GCS_RESULTSTR 結果文字列 結果文字列は、ユーザーがコンポジション プロセスを完了しようとしているときに使用できます。 この文字列を取得し、文字を編集ボックスに送信する必要があります。

WM_IME_ENDCOMPOSITION

IMM は、IME コンポジション操作が終了すると、WM_IME_ENDCOMPOSITION メッセージをアプリケーションに送信します。 これは、ユーザーが Enter キーを押してコンポジション文字列を承認するか、ESC キーを押してコンポジションを取り消したときに発生する可能性があります。 CDXUTIMEEditBox は、コンポジション文字列バッファーを空に設定することで、このメッセージを処理します。 その後、コンポジション ウィンドウが閉じられ、編集ボックス内のカーソルが再び表示されるため、s_bHideCaretを FALSE に設定します。

CDXUTIMEEditBox メッセージ ハンドラーでは、s_bShowReadingWindowも FALSE に設定されます。 このフラグは、編集ボックスがそれ自体をレンダリングするときにクラスが読み取りウィンドウを描画するかどうかを制御します。そのため、コンポジションの終了時に FALSE に設定する必要があります。

WM_IME_NOTIFY

IMM は、IME ウィンドウが変更されるたびに、WM_IME_NOTIFY メッセージをアプリケーションに送信します。 IME ウィンドウの描画を処理するアプリケーションでは、ウィンドウの内容に対する更新が認識されるように、このメッセージを処理する必要があります。 wParam は、実行されているコマンドまたは変更を示します。 CDXUTIMEEditBox は、次のコマンドを処理します。

IME コマンド 説明
IMN_SETOPENSTATUS この属性には、コンポジション文字列内の各文字の状態 (たとえば、変換された文字や変換されていない文字) などの情報が含まれます。 CDXUTIMEEditBox は、コンポジション文字列の属性に基づいて異なる方法で色を付けるので、この情報が必要です。
/ IMN_OPENCANDIDATEIMN_CHANGECANDIDATE 候補ウィンドウがそれぞれ開かれるか更新されるときに、アプリケーションに送信されます。 変換されたテキストの選択を変更する場合は、候補ウィンドウが開きます。 ウィンドウは、ユーザーが選択インジケーターを移動するか、ページを変更すると更新されます。 CDXUTIMEEditBox では、これらのコマンドの両方に 1 つのメッセージ ハンドラーが使用されます。これは、必要なタスクがまったく同じであるためです。
  1. CDXUTIMEEditBox は、候補リスト構造の bShowWindow メンバー s_CandList TRUE に設定して、フレームレンダリング中に候補ウィンドウを描画する必要があることを示します。
  2. CDXUTIMEEditBox は 、ImmGetCandidateList を呼び出して候補リストを取得し、最初に必要なバッファー サイズを取得してから、もう一度実際のデータを取得します。
  3. s_CandListプライベート候補リスト構造は、取得した候補データで初期化されます。
  4. 候補文字列は文字列の配列として格納されます。
  5. 選択したエントリのインデックスとページ インデックスが保存されます。
  6. CDXUTIMEEditBox は、候補のウィンドウ スタイルが縦または横のどちらであるかを確認します。 ウィンドウ スタイルが水平方向の場合は、追加の文字列バッファー (s_CandList の HoriCand メンバー) を、すべての候補文字列で初期化し、隣接するすべての文字列の間にスペース文字を挿入する必要があります。 垂直候補ウィンドウをレンダリングすると、個々の候補文字列が一度に 1 つずつ描画され、文字列ごとに y 座標がインクリメントされます。 ただし、この HoriCand 文字列は、スペース文字が同じ行で 2 つの隣接する文字列を区切る最適な方法であるため、水平候補ウィンドウをレンダリングするときに使用する必要があります。
IMN_CLOSECANDIDATE 候補ウィンドウが閉じようとしているときにアプリケーションに送信されます。 これは、ユーザーが候補リストから選択した場合に発生します。 CDXUTIMEEditBox は、候補ウィンドウの表示フラグを FALSE に設定し、候補文字列バッファーをクリアすることで、このコマンドを処理します。
IMN_PRIVATE ユーザーが文字を入力または削除した結果、IME が読み取り文字列を更新したときにアプリケーションに送信されます。 アプリケーションは読み取り文字列を取得し、レンダリングのために保存する必要があります。 CDXUTIMEEditBox には、IME で文字列の読み取りがどのようにサポートされているかに基づいて、読み取り文字列を取得する 2 つのメソッドがあります。
  • IME で GetReadingString 関数がサポートされている場合は、読み取り文字列を取得するために GetReadingString が呼び出されます。
  • IME で GetReadingString が実装されていない場合、CDXUTIMEEditBox は入力コンテキストコンテンツから読み取り文字列を取得します。

表示

IME 要素とウィンドウのレンダリングは簡単です。 CDXUTIMEEditBox を使用すると、編集コントロールの上に IME ウィンドウが表示されるため、基本クラスを最初にレンダリングできます。 基本編集ボックスがレンダリングされると、CDXUTIMEEditBox は各 IME ウィンドウ (インジケーター、コンポジション、候補、閲覧ウィンドウ) の可視性フラグをチェックし、表示する必要がある場合はウィンドウを描画します。 さまざまな IME ウィンドウの種類の説明については、「既定の IME 動作」を参照してください。

入力ロケール インジケーター

入力ロケール インジケーターは、常に表示される要素であるため、他の IME ウィンドウの前にレンダリングされます。 そのため、他の IME ウィンドウの下に表示されます。 CDXUTIMEEditBox は RenderIndicator メソッドを呼び出してインジケーターをレンダリングします。このメソッドでは、現在の IME 変換モードを反映する静的変数s_ImeState調べることによってインジケーターのフォントの色が決定されます。 IME が有効でネイティブ変換がアクティブな場合、メソッドはインジケーターの色としてm_IndicatorImeColorを使用します。 IME が無効になっている場合、または非ネイティブ変換モードの場合は、インジケーター テキストを描画するためにm_IndicatorImeColorが使用されます。 既定では、インジケーター ウィンドウ自体は編集ボックスの右側に描画されます。 アプリケーションでは、RenderIndicator メソッドをオーバーライドすることで、この動作を変更できます。

次の図は、英語、英数字変換モードの日本語、ネイティブ変換モードの日本語の入力ロケール インジケーターのさまざまな外観を示しています。

英語と日本語の入力ロケール インジケーターの異なる外観

コンポジション ウィンドウ

コンポジション ウィンドウの描画は、CDXUTIMEEditBox の RenderComposition メソッドで処理されます。 コンポジション ウィンドウは編集ボックスの上に浮動します。 基になる編集コントロールのカーソル位置に描画する必要があります。 CDXUTIMEEditBox は、レンダリングを次のように処理します。

  1. コンポジション文字列全体は、既定のコンポジション文字列の色を使用して描画されます。
  2. 特定の特殊属性を持つ文字は異なる色で描画する必要があるため、CDXUTIMEEditBox はコンポジション文字列の文字を確認し、string 属性を検査します。 属性が異なる色を呼び出す場合、文字は適切な色で再描画されます。
  3. コンポジション ウィンドウのカーソルが描画され、レンダリングが完了します。

カーソルは韓国語 IME の場合は点滅しますが、他の IME では点滅しません。 RenderComposition は、韓国語の IME を使用するときに、タイマー値に基づいてカーソルを表示するかどうかを決定します。

読み取りと候補ウィンドウ

読み取りウィンドウと候補ウィンドウは、同じ CDXUTIMEEditBox メソッド RenderCandidateReadingWindow によってレンダリングされます。 どちらのウィンドウにも、垂直レイアウト用の文字列の配列、または水平レイアウトの場合は 1 つの文字列が含まれます。 RenderCandidateReadingWindow のコードの大部分は、ウィンドウの一部がアプリケーション ウィンドウの外部に配置されず、クリップされるようにウィンドウを配置するために使用されます。

制限事項

IME には、テキストの入力の容易さを向上させるための高度な機能が含まれている場合があります。 新しい IME の一部の機能を次の図に示します。 これらの高度な機能は DXUT には存在しません。 これらの高度な機能のサポートの実装は、IME から必要な情報を取得するためのインターフェイスが定義されていないため、困難な場合があります。

拡張候補リストを含む高度な繁体字中国語 IME:

拡張された候補リストを持つ高度な伝統的な中国語のime

高度な日本語 IME と、その意味を説明する追加のテキストを含む候補エントリが含まれています。

高度な日本語 ime とその意味を説明する追加のテキストを含むいくつかの候補エントリ

手書き認識システムを含む高度な韓国語 IME:

手書き認識システムを含む高度な韓国語のime

レジストリ情報

現在の IME が GetReadingString() を実装していない古い CHT New Phonetic である場合は、読み取りウィンドウの向きを確認するために、次のレジストリ情報がチェックされます。

キー
HKCU\software\microsoft\windows\currentversion\IME_Name キーボード マッピング

ここで、IME ファイルのバージョンが 5.1 以降の場合、IME_Nameは MSTCIPH です。それ以外の場合IME_Nameは TINTLGNT です。

読み取りウィンドウの向きは、次のいずれかの場合は水平方向です。

  • IME はバージョン 5.0 で、キーボード マッピング値は 0x22 または 0x23
  • IME はバージョン 5.1 またはバージョン 5.2 で、キーボード マッピング値は0x22、0x23、または0x24です。

どちらの条件も満たされていない場合、読み取りウィンドウは垂直です。

付録 A: オペレーティング システムごとの CHT バージョン

オペレーティング システム CHT IME バージョン
Windows 98 4.2
Windows 2000 4.3
unknown 4.4.
Windows ME 5.0
Office XP 5.1
Windows XP 5.2
スタンドアロン Web ダウンロード可能 6.0

詳細情報

詳細については、次のトピックを参照してください。

GetReadingString

文字列情報の読み取りを取得します。

パラメーター

himc

[入力]入力コンテキスト。

uReadingBufLen

[入力]WCHAR の lpwReadingBuf の長さ。 0 の場合は、クエリ読み取りバッファーの長さを意味します。

lpwReadingBuf

[out]読み取り文字列を返します (末尾が 0 ではありません)。

pnErrorIndex

[out]ある場合は、読み取り文字列内のエラー文字のインデックスを返します。

pfIsVertical

[out]TRUE の場合、UI の読み取りは垂直です。 それ以外の場合は、水平 puMaxReadingLen。

puMaxReadingLen

[out]読み取り UI の長さ。 最大読み取り長は固定されていません。これは、キーボード レイアウトだけでなく、入力モード (内部コード、サロゲート入力など) にも依存します。

戻り値

読み取り文字列の長さ。

解説

戻り値が uReadingBufLen の値より大きい場合、すべての出力パラメーターは未定義です。

この関数は CHT IME 6.0 以降で実装され、IME モジュール ハンドルの GetProcAddress によって取得できます。IME モジュール ハンドルは、ImmGetIMEFileName と LoadLibrary によって取得できます。

必要条件

ヘッダー

Imm.h で宣言されています。

ライブラリのインポート

Imm.lib を使用します。

ShowReadingWindow

閲覧ウィンドウを表示 (または非表示) します。

パラメーター

himc

[入力]入力コンテキスト。

bShow

[入力]読み取りウィンドウを表示するには TRUE に設定します (非表示にする場合は FALSE)。

戻り値

解説

成功した場合は TRUE、それ以外の場合は FALSE を返します。

必要条件

ヘッダー

Imm.h で宣言されています。

ライブラリのインポート

Imm.lib を使用します。