LONG ImmGetCompositionString( HIMC hIMC, DWORD InfoType, LPVOID Buf, DWORD BufSize);
引数の意味は、以下の通り。
hIMC | (IN) | 情報の取得元の入力コンテキストを示すハンドル |
InfoType | (IN) | どのような情報を取得するかを識別するフラグ。後述の表を参照。 |
Buf | (OUT) | 取得した情報を格納するためのバッファ。 |
BufSize | (OUT) | Bufのサイズ。0を指定した場合、戻り値に必要なサイズが返される。 |
InfoTypeに指定可能な値は、以下のいずれかのフラグである。
GCR_ERRORSTR | 不明。 |
GCR_INFORMATIONSTR | 不明。 |
GCS_COMPATTR | 入力されている文字列中の各バイト値の属性を表す8bit整数フラグの配列がbufに返される。すなわち、2バイト文字の第二バイトの属性情報も返される。戻り値は、配列の要素数。返される値の意味は、後述の表を参照。 |
GCS_COMPCLAUSE | 各文節の位置をバイト単位で表す、32bit整数のオフセット値の配列が、bufに返される。ただし、配列の末尾に、入力されている文字列長をバイト数で表した値が格納される。戻り値は配列のバイトサイズ。 |
GCS_COMPREADATTR | 変換途中の文字列中の各文字の属性を示す8bit整数のフラグの配列が、bufに返される。戻り値は、配列のバイトサイズ。返される値の意味は、後述の表を参照。 |
GCS_COMPREADCLAUSE | 各文節の位置を文字数で表す、32bit整数のオフセット値の配列が、bufに返される。ただし、配列の末尾に、入力されている文字列長を文字数で表した値が格納される。戻り値は配列のバイトサイズ。 |
GCS_COMPREADSTR | 入力された文字列を1バイトカタカナで表した文字列をbufに返す。戻り値は、文字列のバイトサイズ。 |
GCS_COMPSTR | 入力されている文字列をbufに返す。戻り値は、文字列のバイトサイズ。 |
GCS_CURSORPOS | 戻り値は、現在のカーソル位置。 |
GCS_DELTASTART | 戻り値は、最後に変更がされた文字列の先頭位置。 |
GCS_RESULTCLAUSE | 最後に変換を行った際の各文節の位置をバイト単位で表す、32bit整数のオフセット値の配列が、bufに返される。ただし、配列の末尾に、入力された文字列長をバイト数で表した値が格納される。戻り値は、配列のバイトサイズ。 |
GCS_RESULTREADCLAUSE | 最後に変換を行った際の各文節の位置を文字単位で表す、32bit整数のオフセット値の配列が、bufに返される。ただし、配列の末尾に、入力された文字列長を文字数で表した値が格納される。戻り値は、配列のバイトサイズ。 |
GCS_RESULTREADSTR | 最後に変換を行った際に入力された文字列を1バイトカタカナで表した文字列をbufに返す。戻り値は、文字列のバイトサイズ。 |
GCS_RESULTSTR | 最後に変換を行った際の変換結果の文字列をbufに返す。戻り値は、文字列のバイトサイズ。 |
GCS_TYPINGINFO | ユーザが入力した生の文字列をbufに返す。ローマ字入力ならば、入力した英字の列が返されるだろう。 |
GCS_COMPATTR及びGCS_COMPREADATTRを指定した際に返される配列中の各値の意味は、以下の通り。
ATTR_INPUT | 選択されていなく、変換されていない文字。 |
ATTR_TARGET_CONVERTED | 選択されていて、変換されている文字。 |
ATTR_CONVERTED | 選択されてなく、変換されている文字。 |
ATTR_TARGET_NOTCONVERTED | 選択されていて、変換されていない文字。 |
ATTR_INPUT_ERROR | 無効な文字。 |
GCS_RESULTREADSTRなどで返される情報は、変換を終了してから、再び文字列の入力を開始するまでの間のみ有効な情報が返される。再び入力を開始したならば、サイズ0の情報が返される。文節に関する情報は、次の変換実行までの間有効となる。
bufに文字列が返されるとき、この文字列がNULL文字で終わるとは限らない。従って、bufに返された文字列の長さを戻り値によって判定しなければならない。
関数の実行に成功した場合、InfoTypeに応じた戻り値が返される。BufSizeに0を指定した場合、必要なサイズが返される。エラーが発生した場合、以下のエラーが返される。
IMM_ERROR_NODATA | 入力コンテキストの準備ができていない。 |
IMM_ERROR_GENERAL | 何らかのエラーが発生した。 |
#define INFONUM 4 #define BUFMAX 1000 void DispCompStrInfo(hDispWnd, hTargetWnd) HWND hDispWnd; /* 情報を表示するウィンドウ */ HWND hTargetWnd; /* 情報を取得するウィンドウ */ { HIMC hImc; char InfoResult[BUFMAX], InfoMsg[BUFMAX]; LONG RetSize; HDC hDC; RECT r; int i; DWORD InfoType[INFONUM] = { GCS_COMPREADSTR, GCS_COMPSTR, GCS_RESULTSTR, GCS_RESULTREADSTR, }; char *InfoTitle[INFONUM] = { "入力されている文字列の1バイトカタカナによる表現", "入力されている文字列", "最後に変換した際の変換結果", "最後に変換した際の変換結果の1バイトカタカナによる表現", }; /* 表示領域の初期化 */ hDC = GetDC(hDispWnd); GetClientRect(hDispWnd, &r); FillRect(hDC, &r, (HBRUSH)GetStockObject(DKGRAY_BRUSH)); /* 入力コンテキストの取得 */ hImc = ImmGetContext(hTargetWnd); /* 文字列情報 */ for(i=0; i<INFONUM; i++) { /* 情報の取得 */ RetSize = ImmGetCompositionString(hImc, InfoType[i], InfoResult, BUFMAX); InfoResult[RetSize] = '\0'; /* 情報の表示 */ wsprintf(InfoMsg, "%s: %s", InfoTitle[i], InfoResult); TextOut(hDC, 0, i*20, InfoMsg, lstrlen(InfoMsg)); } /* 入力コンテキストの解放 */ ImmReleaseContext(hTargetWnd, hImc); /* 後処理 */ ReleaseDC(hDispWnd, hDC); }
#define BUFMAX 1000 #define INFONUM 4 void DispCompClauseInfo(hDispWnd, hTargetWnd) HWND hDispWnd; /* 情報を表示するウィンドウ */ HWND hTargetWnd; /* 情報を取得するウィンドウ */ { HIMC hImc; DWORD ClauseOffset[BUFMAX]; char InfoMsg[BUFMAX]; LONG ClauseNum, j; HDC hDC; RECT r; int i, y = 0; DWORD InfoType[INFONUM] = { GCS_COMPCLAUSE, GCS_COMPREADCLAUSE, GCS_RESULTCLAUSE, GCS_RESULTREADCLAUSE }; char *InfoTitle[INFONUM] = { "入力されている文字列のバイト単位の文節位置及び文字列サイズ:", "入力されている文字列の文字単位の文節位置及び文字列サイズ:", "最後に変換した際の変換結果のバイト単位の文節位置および文字列サイズ:", "最後に変換した際の変換結果の文字単位の文節位置および文字列サイズ:", }; /* 表示領域の初期化 */ hDC = GetDC(hDispWnd); GetClientRect(hDispWnd, &r); FillRect(hDC, &r, (HBRUSH)GetStockObject(DKGRAY_BRUSH)); /* 入力コンテキストの取得 */ hImc = ImmGetContext(hTargetWnd); /* 文字列情報 */ for(i=0; i<INFONUM; i++) { /* タイトルの表示 */ TextOut(hDC, 0, (y++)*20, InfoTitle[i], lstrlen(InfoTitle[i])); /* 情報の取得 */ ClauseNum = ImmGetCompositionString(hImc, InfoType[i], ClauseOffset, BUFMAX); ClauseNum = ClauseNum / sizeof(DWORD); /* バイトサイズを配列の要素数に変換 */ /* 情報の表示 */ for(j=0; j<ClauseNum; j++) { if(j < ClauseNum-1) { /* j番目の文節の位置を表示 */ wsprintf(InfoMsg, " %d番目の文節: %d", j+1, ClauseOffset[j]); TextOut(hDC, 0, (y++)*20, InfoMsg, lstrlen(InfoMsg)); } else { /* 末尾の配列要素の場合、総計を表す */ wsprintf(InfoMsg, " 総計: %d", ClauseOffset[ClauseNum-1]); TextOut(hDC, 0, (y++)*20, InfoMsg, lstrlen(InfoMsg)); } } } /* 入力コンテキストの解放 */ ImmReleaseContext(hTargetWnd, hImc); /* 後処理 */ ReleaseDC(hDispWnd, hDC); }
#define BUFMAX 1000 #define INFONUM 2 void DispCompCharAttr(hDispWnd, hTargetWnd) HWND hDispWnd; /* 情報を表示するウィンドウ */ HWND hTargetWnd; /* 情報を取得するウィンドウ */ { HIMC hImc; BYTE CharAttr[BUFMAX]; char InfoMsg[BUFMAX], *AttrMsg; LONG CharNum, j; HDC hDC; RECT r; int i, y = 0; DWORD InfoType[INFONUM] = { GCS_COMPREADATTR, GCS_COMPATTR, }; char *InfoTitle[INFONUM] = { "変換途中の文字列の文字単位での属性:", "入力されている文字列のバイト単位での属性:" }; /* 表示領域の初期化 */ hDC = GetDC(hDispWnd); GetClientRect(hDispWnd, &r); FillRect(hDC, &r, (HBRUSH)GetStockObject(DKGRAY_BRUSH)); /* 入力コンテキストの取得 */ hImc = ImmGetContext(hTargetWnd); /* 文字列情報 */ for(i=0; i<INFONUM; i++) { /* タイトルの表示 */ TextOut(hDC, 0, (y++)*20, InfoTitle[i], lstrlen(InfoTitle[i])); /* 情報の取得 */ CharNum = ImmGetCompositionString(hImc, InfoType[i], CharAttr, BUFMAX); for(j=0; j<CharNum; j++) { /* 文字属性のメッセージ設定 */ switch(CharAttr[j]) { case ATTR_INPUT: AttrMsg = "選択されていなく、変換されていない文字"; break; case ATTR_TARGET_CONVERTED: AttrMsg = "選択されていて、変換されている文字"; break; case ATTR_CONVERTED: AttrMsg = "選択されていなく、変換されている文字"; break; case ATTR_TARGET_NOTCONVERTED: AttrMsg = "選択されていて、変換されていない文字"; break; case ATTR_INPUT_ERROR: AttrMsg = "無効な文字"; break; } /* 情報表示 */ wsprintf(InfoMsg, " %d番目の文字: %s", j+1, AttrMsg); TextOut(hDC, 0, (y++)*20, InfoMsg, lstrlen(InfoMsg)); } } /* 入力コンテキストの解放 */ ImmReleaseContext(hTargetWnd, hImc); /* 後処理 */ ReleaseDC(hDispWnd, hDC); }
void DispCompCursorPos(hDispWnd, hTargetWnd) HWND hDispWnd; /* 情報を表示するウィンドウ */ HWND hTargetWnd; /* 情報を取得するウィンドウ */ { HIMC hImc; char InfoMsg[BUFMAX]; LONG CursorPos; HDC hDC; RECT r; /* 表示領域の初期化 */ hDC = GetDC(hDispWnd); GetClientRect(hDispWnd, &r); FillRect(hDC, &r, (HBRUSH)GetStockObject(DKGRAY_BRUSH)); /* 入力コンテキストの取得 */ hImc = ImmGetContext(hTargetWnd); /* カーソル位置取得 */ CursorPos = ImmGetCompositionString(hImc, GCS_CURSORPOS, NULL, 0); /* カーソル位置表示 */ wsprintf(InfoMsg, " カーソル位置: %d", CursorPos); TextOut(hDC, 0, 0, InfoMsg, lstrlen(InfoMsg)); /* 入力コンテキストの解放 */ ImmReleaseContext(hTargetWnd, hImc); /* 後処理 */ ReleaseDC(hDispWnd, hDC); }