デバイスコンテキストを重複してGetDCしてよいのでしょうか?

解決


Fusa  URL  2008-01-20 20:32:16  No: 29407

連続で質問っす。失礼しています。

理解を深めようと勉強してみました。

C := TCanvas.Create;
C.Handle := GetDC(Edit1.Handle);

Cを使って何かする

ReleaseDC(Edit1.Handle, C.Handle);
C.Free;
こうすればよいことはわかってきました。
※try finallyは書かないでおいています。

では、以下のように同じウィンドウハンドルから
二回、GetDCしてもいいのでしょうか?

C1 := TCanvas.Create;
C2 := TCanvas.Create;
C1.Handle := GetDC(Edit1.Handle);
C2.Handle := GetDC(Edit1.Handle);

C1を使って何かする
C2を使って何かする

ReleaseDC(Edit1.Handle, C1.Handle);
ReleaseDC(Edit1.Handle, C2.Handle);
C1.Free;
C2.Free;

同じ物から、デバイスコンテキストを複数
利用するために作り出して、正しく動作する物なのでしょうか?
疑問です。

よくわかるかた教えてください。
また、よくわかるページがあれば教えてください。

よろしくお願いします。

デバイスコンテキストとハンドル
http://www.kab-studio.biz/Programing/Codian/MxA/08.html
このページを読んでいるところですが
ウィンドウハンドルからデバイスコンテキストを
二重に生成してよいものかどうか
というのはわかりません。

"GetDCでデバイスコンテキストを生成する"
と、思いこんでいるのですが、
この理解が間違っていて言っていることが変になっているかもしれません。

GetDC
http://yokohama.cool.ne.jp/chokuto/urawaza/api/GetDC.html
ここは読みました。

Edit1はすでにデバイスコンテキストを持っていて
そのハンドルを知るために、GetDCをしているのか.....な?
そしたらReleaseDCってのは、そもそもなんのために...
Edit1が破棄される時に解放されるんじゃないのか?

難しいな。


Delphi におまかせ  2008-01-21 02:31:18  No: 29408

VCLのクライアント領域のDCは最大4個なので、LockされてないCanvasのDCは古いものから自動破棄されてしまうということ。
ただし、DCの直接使用でなく、Canvas自体を使う限り、たとえ自動破棄されていても、必要な時に再作成されるので問題無し。
ReleaseDCは、そのDCをほかのアプリが使用できるように解放するらしいけど、解放しなくて不都合が起きるような例があるのかなぁ・・・・・


Fusa  2008-01-22 03:49:17  No: 29409

なるほど、けっこう、VCLでは
自動でおまかせなのですね。
適当で大丈夫なんか…

ま、ReleaseDCをおこなっておくことにします。

ありがとうございます。


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

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






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