説明しづらいので、プログラムっぽいものを書きます。
HDC hdc;
HPEN hpen;
hdc = BeginPaint(/*省略*/);
hpen = CreatePen(/*省略*/);
SelectObject(hdc , hpen);
/*何か描画する*/
EndPaint(/*省略*/);
DeleteObject(hpen);
とすると、EndPaintでデバイスコンテキストを破棄していますが、破棄するとペンはデフォルトに戻るのでしょうか?
>EndPaintでデバイスコンテキストを破棄していますが、
破棄していませんよ。イメージ的に言うならば、"占有を放棄する"とでも言うので
しょうか。(BeginPaintで占有を開始する)
だからhdcにペンを選択させた状態でのDeleteObjectは危険です。
空のペンを持っている状態になってしまいます。
次にWM_PAINTが呼ばれるときに再度ペンを作って選択させていますから、
一見問題なく動いているように見えますが、他の部分でGetDCとかすると
ペンがなくて困った事になります。
てつやさん、返信ありがとうございます!破棄ではなく放棄なんですね。
>ペンを選択させた状態でのDeleteObjectは危険です。
それでは、EndPaintする前にもう一回SelectObjectしてデフォルトのペンに戻せば良いんでしょうか?(もちろん、最初のSelectObjectでデフォルトペンを変数に入れてです。)あと、このプログラムはあるAPIの講座のもの(ネットで見つけました)なんですが、この方法は良くないということでしょうか?
>それでは、EndPaintする前にもう一回SelectObjectしてデフォルトのペンに戻
>せば良いんでしょうか?(もちろん、最初のSelectObjectでデフォルトペンを
>変数に入れてです。)
そうです。
>あと、このプログラムはあるAPIの講座のもの(ネットで見つけました)なんです
>が、この方法は良くないということでしょうか?
SelectObjectで元のペンに戻したら、作ったペンはDeleteObjectしないとどんどん
リソースを消費してしまいます。
ですから元のペンに戻していれば、全然問題ないです。
お早い返信ありがとうございます!てつやさ様のおかげですっきりしました!
すいません。てつやさ様ではなく、てつや様です。申し訳ありません
ツイート | ![]() |