EndPaintは・・・

解決


TERU  2004-09-13 03:45:25  No: 54468  IP: [192.*.*.*]

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

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

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

編集    削除
てつや  2004-09-13 05:19:21  No: 54469  IP: [192.*.*.*]

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

編集    削除
TERU  2004-09-14 01:12:55  No: 54470  IP: [192.*.*.*]

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

編集    削除
てつや  2004-09-14 01:32:44  No: 54471  IP: [192.*.*.*]

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

編集    削除
TERU  2004-09-14 01:52:32  No: 54472  IP: [192.*.*.*]

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

編集    削除
TERU  2004-09-14 01:54:34  No: 54473  IP: [192.*.*.*]

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

編集    削除