テクニカルレシピ(Visual C++のレシピ)

Home>>Visual C++>>ちらつき防止 LastUpdate:2009-01-21

ダブルバッファリング

多数の連続した描画処理を行う場合、画面の「ちらつき」が発生します。

この問題を防ぐにはダブルバッファリングという技術を使います。
ダブルバッファリングは仮想的な(メモリ上の)デバイスコンテキストに一度描画処理を行い、
一通り描画が終わった段階で実際のデバイスコンテキストに描画結果を転送することです。

言葉で書くと難しそうですが、追加するコードはあまり多くありません。
このダブルバッファリングはよく使うテクニックなので、
とりあえずコードの書き方だけでも憶えてください。
(ソースファイルはサンプルコードのtips3.zipにまとめてあります。)

前項までに動的レイアウト再描画処理を加えたダメアプリをさらに改良してみます。
ダブルバッファリングの処理はOnPaintに記述します。
(OnPaintが描画を扱う関数だからです。)

具体的な記述を下に示します。else以下(@以下)に注目してください。

まず仮想デバイスコンテキスト(memDC)を作成し(A)、
次に実際のデバイスコンテキストと同じ大きさのビットマップ(memBmp)を作成します(B)。

このビットマップ(memBmp)が仮想デバイスコンテキストの実体となるので、
SelectObjectを使って仮想デバイスコンテキスト(memDC)にこのビットマップを設定します(C)。

あとはこの仮想デバイスコンテキスト(memDC)に描画を行うだけです(D)。
「memDC.Rectangle」、「memDC.Ellipse」等を使い普通のデバイスコンテキストと同様に書いてください。

全ての描画が終わった段階で仮想デバイスコンテキストを実際の画面に転送します(E)。
画像表示のとろこでも説明しましたが、
デバイスコンテキストの内容はBitBltというAPIを使って実際の画面に転送します。

以上の処理により、
直接デバイスコンテキストに対して描画する場合に比べスムーズな描画が可能になります。

再描画処理:前項<< ページの先頭に戻る >>次項:フリーズ防止