ブラシの削除 – プログラミング – Home

通知
すべてクリア

[解決済] ブラシの削除


歯磨き
 歯磨き
(@歯磨き)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

hBrush = CreateSolidBrush(123);
に対して
DeleteObject(hBrush);
があるけど、
SelectObject(hDC, hBrush);
っていうのは、これを使い終わった後に取り消し
する記述は必要ないんですか?


引用未解決
トピックタグ
EIJI
 EIJI
(@EIJI)
ゲスト
結合: 24年前
投稿: 76
 

最初のSelectObject()の戻り値を保存しておいて、使用後に再度SelectObject()で
元に戻します。
って、こういう意味ではないのかな?


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

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

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


返信引用
歯磨き
 歯磨き
(@歯磨き)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

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


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

SelectObject()は領域を確保するわけではありません。
ですから、「解放」という考え方はありません。


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

歯磨きさんへ

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

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

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

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

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

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

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

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

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

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

hBrush = ::CreateSolidBrush(123);

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

//描画処理等

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

::DeleteObject(hBrush);


返信引用
歯磨き
 歯磨き
(@歯磨き)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

不慮PGさんありがとうございます。

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

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

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

ということですね?

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


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

>不慮PGさんありがとうございます。
早速間違ってますw、不良PGです

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

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

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


返信引用
歯磨き
 歯磨き
(@歯磨き)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

不良PGさん、名前間違えてごめんなさい。
デフォルトで白とは限らない場合があるというのは
初めて知りました。ありがとうございました。


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

>デフォルトで白とは限らない場合があるというのは
そういうことではなくて通常、白だとは、思いますが白と言い切るのは、ちょっと・・
っていう意味です(^^;


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました