CreateCompatibleDC と CreateCompatibleBitmap について

CreateCompatibleDC と CreateCompatibleBitmap を使えば
DirectXを使わなくても,画面描画にダブルバッファを使え,
裏画面を用意できる。そのため,描画中の状態を表示せずに,
描画が終わったら,BitBlt のAPIを使って画面更新がきれいに出来る。
簡単なゲームや簡単なマルチメディアデモのなどの画面描画にぴったり。

で,いつも気になる点があって,

MSDNの CreateCompatibleBitmap の APIの説明:
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpgdi/html/_win32_createcompatiblebitmap.asp

ここで,サンプルコードに

HDC memDC = CreateCompatibleDC (hDC);
HBITMAP memBM = CreateCompatibleBitmap (hDC);
SelectObject (memDC, memBM);

とある。が・・・。気になる点

MSDNの CreateCompatibleDC の APIの説明:
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpgdi/html/_win32_createcompatibledc.asp

表示サーフェスはモノクロームであり、高さと幅は 1 ピクセル×1 ピクセルです。
とある。
要するに,CreateCompatibleDC は最初 1x1のモノクロビットマップが設定されている。

で,さっきのプログラムの最後の行
SelectObject (memDC, memBM);
をしてしまうと, memDC は,memBMのビットマップが設定されてしまい,
最初にあった 1x1のモノクロビットマップ は参照しなくなってしまう。

このモノクロ1x1のビットマップって,削除(DeleteObject)しなくていいんだろうか。
多分しなくても問題ないんだろう・・・。メモリリークにならないのかなぁ。。。

うーん。WindowsのAPIのハンドルは,同じ型のハンドルでも
削除しなければならない。削除してはいけない。
削除してもしなくてもよい。閉じてから削除しなければならない。...
等いろいろあってややこしい。

これを間違ってリソースのメモリーリークとか不正な処理をするアプリとか
異常終了するアプリがでてくるじゃないのか・・・。

こういう 設計と仕様の詳細の公開をちゃんとすべきだ。

"CreateCompatibleDC と CreateCompatibleBitmap について" へのコメントを書く

お名前
メールアドレス
ホームページアドレス
コメント