...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

C++のGDI+でダブルバッファリング

さあ,誰も読みそうにない記事ができたぞ(w

研究で,久しぶりにMFCを使ったコードをガリガリと書いてるんやけど,ダブルバッファリング関係の処理って,いつも完璧に忘れてしまう.
だから,いつも後回しにして,リリース直前までちらついている画面で開発している.
人事じゃないんだけど困ったもんだ.
じゃあ,ということで忘れることを前提にして,ダブルバッファリングをしてくれるクラスを作ってみた.
すっごい今更感が溢れまくってるけど・・・.

ずーーーーっと,それこそ半年以上,C++でのGDI+で,ダブルバッファリングする方法がわからなかった.
だけど,よく考えてみれば,ダブルバッファリングの処理自体は昔ながらの,GDIでの方法でよかったんだな.
Graphicsクラスを使いたいときは,裏画面のCDCをGraphicsクラスに渡してから描画するだけ.
ああ,脱力.

ついでに,SelectObject()回りもクラス化してしまう.
バイスコンテキストに描画するには,GDIオブジェクトを新規作成してデバイスコンテキストに関連付けてやらないといけないのだけど,同種の前のGDIオブジェクトを保管しておかないといけないことになっている.
その処理が面倒でしょうがない.
なので,自動的に解放してくれるように拡張してしまおう.
まあ,そう言うと聞こえはいいが,単にコンストラクタでデバイスコンテキストと新規オブジェクトを得て,関連付けて,前のオブジェクトをメンバ変数に保管して置いて,デストラクタで元に戻すだけ.
開放忘れを減少できる点は嬉しいけど,それだけではいまいちだったので,GDIオブジェクトが何でも対応できるようにテンプレートクラスにした.
これでちょっとは楽になっただろうか.

ああ,かなりの富豪的プログラミングになったが,まあ,それはそれとしてよしとしようではないか.
でも無理しないで高性能なCPUに頼ってしまったらいいんだって思うよ.

さあ,この調子で実験アプリケーションの実装を進めていこう.