デバイスコンテキストの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してすぐに返せばいいのか?