画面のちらつきをなくす

画面のちらつきとタブコントロールに対する誤解について


CS_HREDRAW や CS_VREDRAW を施し、ウィンドウクラスを登録して、子供ウィンドウの親ウィンドウに WS_CLIPCHILDLEN を指定してからウィンドウを作るのはだいたい決まったやり方。しかしながら一部のコントロールは、このスタイルを指定しただけでは不十分な場合がある。たとえばタブコントロールは、たとえ WS_CLIPSIBLINGS を付けても WM_ERASEBKGND メッセージが送られるため(ただ仕様ではこのメッセージは処理されないことになっている(はず))、いやおう無しに、そこに重なる部分のウィンドウは再描画の影響を受けてしまう。
ウィンドウ内でダブルバッファリングしていたとしてもこれだけはどうにもならない。背景を描き直す処理ではほぼ確実にちらつき(一瞬だけ対象領域が真っ白になる)が発生してしまう。気にならないといえば気にならないが、一旦気にするとどうしても消してしまいたいのが人情(だよね)。だからこの場合はそれらが重なら(overlapping)ないように配置しなければならない。

話は変わるけど、タブコントロールというと、タブの部分とそれに対応する領域からなるコントロールだと考えてしまう。これが間違いである、もしくは違和感がある、と感じた人は、おそらくこの妙なちらつき等、その他さまざまな不都合に時間をかけることはないだろう。まあ、間違いであると言い切ることも出来ないが、実際にはタブコントロールというのはタブを選ぶところだけで、それ以上のことはアプリケーション次第というわけだ…当然といえば当然だよね…ずっと誤解していた。