前後の処理は省くとして
1.CreateCompatibleDCでメモリデバイスコンテキスト作成
2.SelectObjectでビットマップオブジェクトを選択
3.BitBltで画像を転送
4.SelectObjectで元のオブジェクトを選択
5.DeleteDCでメモリデバイスコンテキストを削除
サンプルを公開されているサイトここのような書き方になっているのですが
5. の段階で削除するのであれば 4. の元に戻す処理の必要性がわかりません。
※BitBltの直後にSelectObjectで戻し、DeleteDCで削除しており、
間に余計な処理は入っていません。
上記の処理を行う場合、
1.CreateCompatibleDCでメモリデバイスコンテキスト作成
2.SelectObjectでビットマップオブジェクトを選択
3.BitBltで画像を転送
4.DeleteDCでメモリデバイスコンテキストを削除
このようなやり方だと問題ありますでしょうか?
No.2ベストアンサー
- 回答日時:
1.CreateCompatibleDCでメモリデバイスコンテキスト作成
2.SelectObjectでビットマップオブジェクトを選択
3.BitBltで画像を転送
4.SelectObjectで元のオブジェクトを選択
5.DeleteDCでメモリデバイスコンテキストを削除
2の処理で、選択するビットマップハンドルのユースカウントが1だけインクリメントされます。
4の処理で、選択解除するビットマップハンドルのユースカウントが1だけデクリメントされます。
4の処理が無いと、ビットマップハンドルのユースカウントがインクリメントされたままでデクリメントされません。
そして、ユースカウントが0でないビットマップオブジェクトをDeleteObjectしようとすると、DeleteObjectはエラーを返します。
つまり「ビットマップをDCに割り当てたままだと思い込み、そのビットマップを削除出来なくなる」のです。
この「削除できなかったビットマップ」は、OSを再起動するか、OSをシャットダウンするまでずっと生き残るので、もし「同様の処理が繰り返して行われる」と、最後はシステムリソースが尽きてOS自身がリソース不足で落ちてしまいます。
先ほどの1.~5.の処理の前後には、以下のように「0.」と「6.」の処理がある筈です。普通、別の場所に書いてあるので、見落としがちです。
0.(起動時に1回だけ)CreateBitmap等でビットマップ作成
1.CreateCompatibleDCでメモリデバイスコンテキスト作成
2.SelectObjectでビットマップオブジェクトを選択
3.BitBltで画像を転送
4.SelectObjectで元のオブジェクトを選択
5.DeleteDCでメモリデバイスコンテキストを削除
6.(終了時に1回だけ)DeleteObjectでビットマップ破棄
上記の6.の処理を確実に成功させ、確実にビットマップを破棄するためには、4.の処理でDCとの紐付けを解除する必要があるのです。
上記の仕様は最新のWindowsでも変わっていません。4.の処理は必ず必要です。
しかし、このような「DCとの紐付けの解除忘れ」をする人が多かった為か、最近のWindowsでは紐付けられたDCが削除済みであれば、DeleteObjectがエラーを返さないでオブジェクトを破棄出来るように改良されています(「解除を忘れてる」には違わないので、忘れても動いちゃう事が良い事なのかどうか疑問ですが…)
No.1
- 回答日時:
Windows 3.1/95/98の時代では、そうしないとリソースを食いつぶしOSが不安定になることが多かった気がします。
2000/XPになってからはリソースの管理がうまくなっているようなので滅多に不安定になりませんがね。
おそらくビットマップオブジェクトを選択したままデバイスコンテキストを解放してしまうと、ビットマップオブジェクトが解放できない、ということだと思います。つまりお互い必要とされている、というフラグがたったまま片方が解放されると、もう一つが残されたままになる。。
やっぱちゃんとお行儀良くした方がよいですよ 笑
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Illustrator(イラストレーター) Illustrator アンカーポイント選択について 3 2023/01/30 12:31
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- その他(IT・Webサービス) グーグルドメインズの解約方法 1 2022/08/14 12:52
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) テキストの背後にあるオブジェクトとは 3 2023/01/03 20:22
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- 物理学 物理学の質問です。 あなたの車が9.8m/s^2で加速できる場合、0から時速60マイルまでどのくらい 2 2022/09/19 09:50
- その他(ソフトウェア) 特定のpremiere proのファイルが開けなくなりました。 1 2022/11/16 12:31
- Excel(エクセル) エクセルのVBAにショートカットキーの割り当て 3 2022/07/13 14:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ワイルドカード<?>と型パラメー...
-
VBA 同じ名前のオブジェクトを...
-
BufferedWriterのcloseメソッド
-
パワーポイントのVBAでテキスト...
-
オブジェクトと関数の違い
-
COMコンポーネントって何?
-
C#でフォームのオブジェクト名...
-
Excelファイルをgrep検索したい
-
vb.net オブジェクト指向につい...
-
【Java】入力した西暦→和暦に変...
-
Excel VBA : イコールになら...
-
Error.prototype結果のd {name
-
オブジェクトを枠線に合わせる...
-
署名と検証
-
オブジェクト名をforループ内で...
-
多人数のじゃんけんプログラム
-
VBA 下記ソースについて質問で...
-
CFileDialogでフォルダだけを選...
-
EXCEL VBAにて動的にCheckBOXを...
-
これは名前空間ですか?それと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
vb.net オブジェクト指向につい...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
時間帯判定をする。
-
LISTBOXの内容が更新されま...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ADO オブジェクトの渡し方
-
bmp画像をjpegやpng画像に圧縮...
-
Vbで通常使用するプリンターを...
-
戻り値がクラスオブジェクト
-
VBAでvlookup関数から、別シー...
おすすめ情報