IMEの入力中の文字列に関する文字単位の属性の表示(C言語)

キーワード:

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

サンプルコード:

#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);
}
(original text:1998/12/25 更新)

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