テキストエディタコントロールの自作を試しています。
今回は、変換ウィンドウの位置について質問させて頂きます。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HIMC hImc;
switch (message)
{
case WM_IME_STARTCOMPOSITION:
hImc = 0;
hImc = ImmGetContext(hWnd); // 入力コンテキスト
のハンドルを得る
if (hImc != 0)
{
POINT pa;
pa.x =10;
pa.y =10;
COMPOSITIONFORM cf;
cf.dwStyle = CFS_POINT;
cf.ptCurrentPos = pa;
SetRect(&(cf.rcArea),0,0,0,0);
ImmSetCompositionWindow(hImc,&cf);
}
ImmReleaseContext(hWnd, hImc); // 入力コンテキス
トのハンドルを開放する
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 選択されたメニューの解析:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd,
About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 描画コードをここに追加してください...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
このプロシージャでウィンドウを動作させる時、
Google IMEなら10,10のところで変換が行われるのですが、
Office IMEは変換が行われません
TSFとIMM32の違いだというのはわかるのですが、
Office IMEをIMM32関数で扱う方法をご存知でしょうか?
気がついた点だけ。
1.ImmSetCompositionWindow()の戻り値を評価していませんが、
0が戻った場合は失敗してます。
2.WM_IME_STARTCOMPOSITIONメッセージは、システムが処理すべき
内容を含んでいると考えられます。このメッセージを処理する
コールバックは、システムにその機会を与えるべきです。つまり、
return DefWindowProc( WM_IME_STARTCOMPOSITION, wParam, lParam);
すべきだと考えられます。(実際には戻り値は不要)
詳しくはWM_IME_STARTCOMPOSITIONの説明を参照してください。
うーーん、
Office IME = Microsoft Office IMEとしますと、
Microsoft Officeは、バージヨンによって操作方法が変わります。
バージョンによって仕様が大幅に違う場合もあったかに思います。
>Office IMEをIMM32関数で扱う方法をご存知でしょうか?
IMM32関数で扱う前にOffice IMEに何か設定しなければいけないことがありそうに
思います。
失業者さん
2の通りで、defwndprocを通すと解決しました
ありがとうございます
ITOさん、どうやら私の勘違いだったようです。実際はIME関数で扱えました。
ありがとうございました