EndPaintは・・・

解決


TERU  2004-09-13 03:45:25  No: 54468

説明しづらいので、プログラムっぽいものを書きます。
HDC hdc;
HPEN hpen;

hdc = BeginPaint(/*省略*/);
hpen = CreatePen(/*省略*/);
SelectObject(hdc , hpen);
/*何か描画する*/

EndPaint(/*省略*/);
DeleteObject(hpen);
とすると、EndPaintでデバイスコンテキストを破棄していますが、破棄するとペンはデフォルトに戻るのでしょうか?


てつや  2004-09-13 05:19:21  No: 54469

>EndPaintでデバイスコンテキストを破棄していますが、
破棄していませんよ。イメージ的に言うならば、"占有を放棄する"とでも言うので
しょうか。(BeginPaintで占有を開始する)
だからhdcにペンを選択させた状態でのDeleteObjectは危険です。
空のペンを持っている状態になってしまいます。
次にWM_PAINTが呼ばれるときに再度ペンを作って選択させていますから、
一見問題なく動いているように見えますが、他の部分でGetDCとかすると
ペンがなくて困った事になります。


TERU  2004-09-14 01:12:55  No: 54470

てつやさん、返信ありがとうございます!破棄ではなく放棄なんですね。
>ペンを選択させた状態でのDeleteObjectは危険です。
それでは、EndPaintする前にもう一回SelectObjectしてデフォルトのペンに戻せば良いんでしょうか?(もちろん、最初のSelectObjectでデフォルトペンを変数に入れてです。)あと、このプログラムはあるAPIの講座のもの(ネットで見つけました)なんですが、この方法は良くないということでしょうか?


てつや  2004-09-14 01:32:44  No: 54471

>それでは、EndPaintする前にもう一回SelectObjectしてデフォルトのペンに戻
>せば良いんでしょうか?(もちろん、最初のSelectObjectでデフォルトペンを
>変数に入れてです。)
そうです。
>あと、このプログラムはあるAPIの講座のもの(ネットで見つけました)なんです
>が、この方法は良くないということでしょうか?
SelectObjectで元のペンに戻したら、作ったペンはDeleteObjectしないとどんどん
リソースを消費してしまいます。
ですから元のペンに戻していれば、全然問題ないです。


TERU  2004-09-14 01:52:32  No: 54472

お早い返信ありがとうございます!てつやさ様のおかげですっきりしました!


TERU  2004-09-14 01:54:34  No: 54473

すいません。てつやさ様ではなく、てつや様です。申し訳ありません


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加