IMEの入力中の文字列に関する文節の情報を取得(C言語)

キーワード:

GetDC, GetClientRect, FillRect, ImmGetContext, ImmGetCompositionString, TextOut, ImmReleaseContext, ReleaseDC

サンプルコード:

#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);
}


(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。