IME の使用。
void CXXXView::OnImeStartComposition(WPARAM wParam, LPARAM lParam)
{
COMPOSITIONFORM cpf;
HIMC hIMC;
// ウィンドウハンドルを取得
HWND hWnd = GetSafeHwnd();
if(!hWnd)
{
return;
}
// IME のコンテキストを得る
hIMC = ::ImmGetContext(hWnd);
if(!hIMC)
{
return;
}
// CompositionWinow
cpf.dwStyle = CFS_POINT;
cpf.ptCurrentPos.x = GetCaretPos().x;
cpf.ptCurrentPos.y = GetCaretPos().y;
// フォント
LOGFONT logFont;
m_font.GetLogFont(&logFont);
::ImmSetCompositionFont(hIMC, &logFont);
::ImmSetCompositionWindow(hIMC, &cpf);
// IME のコンテキストを解放
::ImmReleaseContext(hWnd, hIMC);
// デフォルトプロシージャ
DefWindowProc(WM_IME_STARTCOMPOSITION, wParam, lParam);
}
void CXXXView::OnImeChar(WPARAM wParam, LPARAM lParam)
{
// 何もしない
}
void CXXXView::OnImeComposition(WPARAM wParam, LPARAM lParam)
{
if(lParam & GCS_RESULTSTR)
{
COMPOSITIONFORM cpf;
HIMC hIMC;
// ウィンドウハンドルを取得
HWND hWnd = GetSafeHwnd();
if(!hWnd)
{
return;
}
// IME のコンテキストを得る
hIMC = ::ImmGetContext(hWnd);
if(!hIMC)
{
return;
}
// 文字列の取得
int nSize = ::ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0);
char *buf = new char[nSize + 1];
::ImmGetCompositionString(hIMC, GCS_RESULTSTR, buf, nSize);
buf[nSize] = '';
// IME のコンテキストを解放
::ImmReleaseContext(hWnd, hIMC);
// 入力
Input(buf);
delete [] buf;
// ウィンドウの移動
cpf.dwStyle = CFS_POINT;
cpf.ptCurrentPos.x = GetCaretPos().x;
cpf.ptCurrentPos.y = GetCaretPos().y;
::ImmSetCompositionWindow(hIMC, &cpf);
}
// デフォルトプロシージャ
DefWindowProc(WM_IME_COMPOSITION, wParam, lParam);
}