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; }
何で何で?
以上です。