ブラシの削除

[戻る]
歯磨き 2002/02/22(金) 10:21:01
hBrush = CreateSolidBrush(123);
に対して
DeleteObject(hBrush);
があるけど、
SelectObject(hDC, hBrush);
っていうのは、これを使い終わった後に取り消し
する記述は必要ないんですか?

EIJI 2002/02/22(金) 10:30:28
最初のSelectObject()の戻り値を保存しておいて、使用後に再度SelectObject()で
元に戻します。
って、こういう意味ではないのかな?

sugar 2002/02/22(金) 10:31:59
> SelectObject(hDC, hBrush);
>
hDCで認識されるデバイスコンテキストに、hBrushというブラシを割り当てると、
その戻り値として、割り当て前のブラシのハンドルが返ってきます。
(割り当てるというか、取り替えるようなイメージですかね。)

後始末としては、その戻り値のブラシを、hDCにSelectObjectしてやります。
(使用前の状態に戻してあげる。)
「取り消し」とはちょっとニュアンスが違いますね。

歯磨き 2002/02/22(金) 11:21:03
取り消しというのが分かりにくかったと思うけど
int i = 1;
これで領域が確保されるけど、プログラマが
解放させる必要はないのと同じように
SelectObject(hDC, hBrush);
もそのままでいいのか聞きたかったんです。
回答をもらって、解放させる必要はないように思いました。
間違っていたら教えてください。
ありがとうございました。

sugar 2002/02/22(金) 11:54:50
SelectObject()は領域を確保するわけではありません。
ですから、「解放」という考え方はありません。

不良PG 2002/02/22(金) 13:32:05
歯磨きさんへ

答えからいうと間違ってます。

デバイスコンテキストは、最初から1つブラシを持っています。

それをSelectObjectによって自分で作ったブラシをデバイスコンテキストが

使用する事になりますが、最初から持っていたブラシは消えずに残ります。

ですから、自分で作ったブラシを必要としなくなった場合には、

デバイスコンテキストが最初から持っていたブラシをSelectObjectを使って

元に戻してあげる必要があります。

その後、自分で作ったブラシを開放してあげるという順序になります。

※元に戻す前に自分で作ったブラシを開放するとデバイスコンテキストが使うべき
 ブラシがわからなくなり、予想できない動作をする可能性もあります。

コードで言うとこんな感じ

hBrush = ::CreateSolidBrush(123);

HBRUSH hBrushOld = ::SelectObject(hDC, hBrush);

//描画処理等

::SelectObject(hDC, hBrushOld); //これが必要

::DeleteObject(hBrush);

歯磨き 2002/02/22(金) 13:49:39
不慮PGさんありがとうございます。

デバイスコンテキストはデフォルトで白のブラシを持ち
デバイスコンキストは常にブラシを持たねばならない。
SelectObject(hDC, hBrush);
によってブラシを変更し、そのままhBrushを消せば、
デバイスコンキストhDCはブラシを失い、常にブラシを
持つという決まりが破られる。

DeleteObject(hBrush);
する場合は、そのブラシがデバイスコンキストに関連付け
されていてはいけない。

SelectObject(hDC, hBrush);
の関連付け解放は
SelectObject(hDC, hBrushOld);
のような感じで、別のブラシに関連付けることによって行う。

ということですね?

もし違っていたらまた教えてください。

不良PG 2002/02/22(金) 14:01:06
>不慮PGさんありがとうございます。
早速間違ってますw、不良PGです


>デバイスコンテキストはデフォルトで白のブラシを持ち
デフォルトで白とは限らない気がします(ニュアンス的には○)

>デバイスコンキストは常にブラシを持たねばならない。
>SelectObject(hDC, hBrush);
>によってブラシを変更し、そのままhBrushを消せば、
>デバイスコンキストhDCはブラシを失い、常にブラシを
>持つという決まりが破られる。
>
>DeleteObject(hBrush);
>する場合は、そのブラシがデバイスコンキストに関連付け
>されていてはいけない。
>
>SelectObject(hDC, hBrush);
>の関連付け解放は
>SelectObject(hDC, hBrushOld);
>のような感じで、別のブラシに関連付けることによって行う。
>
>ということですね?

あとは、問題なさそう(^^)

歯磨き 2002/02/22(金) 14:55:45
[[解決]]
不良PGさん、名前間違えてごめんなさい。
デフォルトで白とは限らない場合があるというのは
初めて知りました。ありがとうございました。

不良PG 2002/02/22(金) 17:02:02
>デフォルトで白とは限らない場合があるというのは
そういうことではなくて通常、白だとは、思いますが白と言い切るのは、ちょっと・・
っていう意味です(^^;

古いスレッドには追加発言できません。