環境::visual studio 2005, windows xp, api, ユニコード
自作エディットコントロールを作成しています。
ひらがな入力で、
キー入力... 変換(スペースキー) キー入力... 変換(スペースキー) リターン
の動作を処理するために、キー入力時に発生する文字確定で、
確定文字列の獲得且つ、変換ウィンドウの位置移動を実行したいのですが、
キー入力の1つ目で、変換ウィンドウの位置が変わっていない(同じ場所を指定する)と、
表示されていた変換ウィンドウ全体が、黒く塗りつぶされてしまい、
キー入力時のアルファベットが表示されません。
続いてキー入力をすると変換ウィンドウが復帰します。
この変換ウィンドウのバグの原因は何なんでしょうか?
その他情報
処理1を処理2に入れ替えると正常に動作します。
変換ウィンドウを移動(処理3)しなくても表示がおかしくなります。
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp )
{
static HIMC hImc;
static int x = 0;
switch( msg ){
case WM_DESTROY:
PostQuitMessage( 0 );
break;
case WM_IME_STARTCOMPOSITION:
{
hImc = ImmGetContext( hWnd );
COMPOSITIONFORM cf = { CFS_POINT, { x, 0 }, NULL };
ImmSetCompositionWindow( hImc, &cf );
}
break;
case WM_IME_ENDCOMPOSITION:
ImmReleaseContext( hWnd, hImc );
break;
case WM_IME_COMPOSITION:
if( lp & GCS_RESULTSTR ){
int biteSize = ImmGetCompositionString( hImc, GCS_RESULTSTR, NULL, 0 ),
len = biteSize / sizeof(TCHAR);
TCHAR *buf = new TCHAR[ len + 1 ];
ImmGetCompositionString( hImc, GCS_RESULTSTR, buf, biteSize );
*( buf + len ) = TEXT('\0');
// todo
// f( buf );
// todo end
delete [] buf;
COMPOSITIONFORM cf = { CFS_POINT, { x, 0 }, NULL }; // 処理1
// COMPOSITIONFORM cf = { CFS_POINT, { ++x, 0 }, NULL }; // 処理2
ImmSetCompositionWindow( hImc, &cf ); // 処理3
}else{
return DefWindowProc( hWnd, msg, wp, lp );
}
break;
default:
return DefWindowProc( hWnd, msg, wp, lp );
}
return 0;
}
ツイート | ![]() |