Mesoscopic Programming

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

Tips #025 キャレットの表示がむずい

キャレット表示処理メモ

私はいま、異なる複数の子ウィンドウにキャレットを表示させようとして、ガッツリはまってしまいました。
何故かしら1つのウィンドウは表示されるのに、もう1つのウィンドウにはキャレットが表示されないのです。
何でかな?
で、何とか直ったんですけど忘れないようにメモしておきます。
以下のように、異なるウィンドウごとにキャレットの作成と破棄をします。
フォーカスが来てキャレットを表示する直前に CreateCaret() 関数で作成し、
フォーカスを失くした直後に DestroyCaret() 関数でキャレットを削除します。
本当は WM_CREATE と WM_DESTROY でキャレットの作成と破棄をしたかったんだけど、
それだと1つのウィンドウのみではうまく行くんだけど、複数のウィンドウではうまく行きませんでした。

LRESULT DocView :: OnWmSetFocus()
{
    CreateCaret( hwnd, NULL, GetSystemMetrics( SM_CXBORDER ), fontSize.cy );
    SetCaretPos( 0, 0 );
    ShowCaret( hwnd );

    return 0;
}

LRESULT DocView :: OnWmKillFocus()
{
    HideCaret( hwnd );
    DestroyCaret();

    return 0;
}

LRESULT OutView :: OnWmSetFocus()
{
    CreateCaret( hwnd, NULL, GetSystemMetrics( SM_CXBORDER ), fontSize.cy );
    SetCaretPos( 0, 0 );
    ShowCaret( hwnd );

    return 0;
}

LRESULT OutView :: OnWmKillFocus()
{
    HideCaret( hwnd );
    DestroyCaret();

    return 0;
}

何で何で?

以上です。