Tips #026 キャレットとかな漢字変換ウィンドウについて
メモ
テキストビュワーを作っているんですが、
ウィンドウズ標準のエディットコントロールでわ余りに遅すぎだし、機能的にも不便すぎるので自分で作ってまんねん。
でもまだかなり時間がかかりそうなので、とりあえず
かな漢字変換ウィンドウの位置をキャレットの位置にし、ウィンドウの使用フォントと同じにする部分を載せときます。
VOID TextView :: UpdateCaretPos() { INT xpos, ypos; HIMC himc; COMPOSITIONFORM cf; ptCaret.x = nColumn * fontSize.cx + ptOffset.x; ptCaret.y = nLine * fontSize.cy + ptOffset.y; xpos = ptCaret.x - GetScrollPos( hwnd, SB_HORZ ); ypos = ptCaret.y - GetScrollPos( hwnd, SB_VERT ); SetCaretPos( xpos, ypos ); himc = ImmGetContext( hwnd ); ImmSetCompositionFont( himc, & logFont ); ImmGetCompositionWindow( himc, & cf ); GetClientRect( hwnd, & cf.rcArea ); cf.ptCurrentPos.x = cf.rcArea.left = xpos; cf.ptCurrentPos.y = cf.rcArea.top = ypos; ImmSetCompositionWindow( himc, & cf ); ImmReleaseContext( hwnd, himc ); }
キャレットの行と列の位置が nLine と nColumn に設定されてるものとします。
フォント関係の設定は、基底クラスのスクロールウィンドウクラスの方で以下のように設定されてます。
LRESULT Scroll :: OnWmCreate() { HDC hdc = GetDC( hwnd ); TEXTMETRIC tm; ZeroMemory( & logFont, sizeof logFont ); strcpy( logFont.lfFaceName, _T( "Terminal" ) ); logFont.lfHeight = 14; logFont.lfWidth = 0; logFont.lfEscapement = 0; logFont.lfOrientation = 0; logFont.lfWeight = FW_DONTCARE; logFont.lfItalic = FALSE; logFont.lfUnderline = FALSE; logFont.lfStrikeOut = FALSE; logFont.lfCharSet = DEFAULT_CHARSET; logFont.lfOutPrecision = OUT_TT_ONLY_PRECIS; logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; logFont.lfQuality = DEFAULT_QUALITY; logFont.lfPitchAndFamily = FIXED_PITCH; hFont = CreateFontIndirect( & logFont ); SelectObject( hdc, hFont ); GetTextMetrics( hdc, & tm ); ReleaseDC( hwnd, hdc ); fontSize.cx = tm.tmAveCharWidth; fontSize.cy = tm.tmHeight; pageSize.cx = fontSize.cx * 40; pageSize.cy = fontSize.cy * 40; nFullWidth = 0; nFullHeight = 0; return 0; }
以上です。