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