Mesoscopic Programming

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

Programming Tips #034:スクロールバーを動的に追加した直後に完全に描画する方法

概要

もしかすると Vista だけかも知れないが、ウィンドウスタイルのスクロールバーを動的に追加したあと、
SetWindowPos() 関数の SWP_FRAMECHANGED だけだと水平スクロールバーの描画が不完全になる。
何かスクロールつまみの左側の影が表示されないようなのだ。
これはどう考えても Windows のバグとしか思えないが、何とかちゃんと描画する方法を調査した。
スクロールバーを再描画させれば影もちゃんと表示されることが分かった。
でもスクロールバーは非クライアント領域なので InvalidateRect() ではダメだった。
何で InvalidateNcRect()みたいな関数が無いのか不満だが、代わりの関数を見つけた。
RedrawWindow() 関数がそれだった。SetWindowPos() 関数を呼び出したあと、

RedrawWindow( hwnd, NULL, NULL, RDW_UPDATENOW | RDW_FRAME | RDW_INVALIDATE );

とすれば良い。

以上です。