アプリ版:「スタンプのみでお礼する」機能のリリースについて

3Dゲームのソリューションとは別の(Windows XP以前にも対応する)アプリケーションを作っているときに思った事なのですが

GDIで
msdnのSelectObjectの解説には
http://msdn.microsoft.com/ja-jp/library/cc410576 …


-------------
この関数は、指定されたのと同じタイプで、それまで選択されていたオブジェクトを返します。アプリケーションは新しいオブジェクトを使い終えたら、必ず元の(既定)オブジェクトに置き換えるべきです。
-------------



と書いてあるのですが

SetBkModeやSetTextColorについてはそう言った表記がありません。

実際には、これらはReleaseDCやEndPaintの前に初期状態に戻すべきなのでしょうか?
戻さなくても全く問題はないでしょうか?

A 回答 (1件)

SelectObjectするという事は、自分でリソース(ペンやブラシ)を作成しそのリソースを設定すると思います。


(※例外もあるけど)

自分で作成したリソースは、開放(DeleteObject)する必要があります。

質問のSelectObject説明は、この開放時にDCに関連づけたままやっちゃ駄目よ。と(遠まわしに)説明しているのです

説明の『新しいオブジェクトを使い終えたら』というのは、リソースを使い終えたらという事。
リソースを使い終えたら、解放処理をするのだがDCに関連付いているので
元の値に戻して関連付けを解除しないといけません。

上記を踏まえて、SetBkModeやSetTextColorを考えると
開放なんてする必要ないので、元にもどす必要もない。

という事です。
    • good
    • 0
この回答へのお礼

どうもありがとうございます♪

なるほど、そういうことだったのですか。

SelectObjectしておいて開放時にDCに関連づけたままはやばいですね。失敗するだったか、XPだとゾンビ化するだったか忘れましたが、そういう事はしっかりと配慮しています。
アプリケーション開始時にstatic専用のクラスで確保し、終了時に解放、とすれば、毎回生成するコードなしで、SelectObjectで挟み込むだけでOKとなるので、頻繁に使うやつはそのようにしています。

とりあえず、SetBkModeやSetTextColorなどに関しては、数値の設定だけなので問題ない、というわけですね。

お礼日時:2011/04/06 00:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!