Mesoscopic Programming

タコさんプログラミング専門

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

以上です。