デバイスコンテキストのSelectObjectのよくある間違い
「デバイスコンテキストのSelectObjectのよくある間違い」と勝手言い切ったが、そんなこともない。
ただの自分の勘違い。
借りたものは返す。
遅くなっても返す。
と思っていました。
メモリデバイスコンテキストを利用するときに、
CreateCompatibleDC(); CreateDIBSection(); m_hOldBitmap = SelectObject();
みたいに、メモリデバイスコンテキストクラスを作って、Createしたときに、HBITMAPをSelectObjectしてその戻り値をわざわざ保存して、解放時につぎのようなことをしていた。
SelectObject(m_hOldBitmap);
しかし、リファレンスを確認すると
MFC ライブラリ リファレンス
グラフィック オブジェクトをデバイス コンテキストに選択する
http://msdn.microsoft.com/ja-jp/library/ad8zd3da(VS.80).aspx
SelectObject が返すグラフィック オブジェクトは、"一時的" なものです。つまり、プログラムがアイドル状態になったときに、CWinApp クラスの OnIdle メンバ関数によって削除されます。コントロールをメイン メッセージ ループに返さずに、単一の関数内の SelectObject が返すオブジェクトを使用している限り、問題は発生しません。
SelectObjectの戻りは、一時的なものとなっているので、最後に返しても意味がないのではないかと。
借りっぱなしでもよいこともあるようです。
#BLUEMANのDVDをそろそろ…
追加(2009-05-28 16:29:44)
そういうことでもないような…
BitBltするまえに、SelectObjectしてすぐに返せばいいのか?