• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メモリデバイスコンテキスト&ビットマップハンドル)

ビットマップのサイズ変更とBitBltの関係

このQ&Aのポイント
  • ビットマップのサイズを変更して新しいビットマップを作成するプログラムについての質問です。
  • BitBlt関数は、指定されたビットマップの一部を別のビットマップに転送するための関数です。
  • DeleteObject関数は、オブジェクトを削除するための関数であり、ここでは新しいDCオブジェクトを削除している可能性があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス >BitBlt(hNewDC , 0 , 0 , w , h , hdc , 0 , 0 , SRCCOPY); >↑なぜBitBltで転送しているのかわかりません。  最初にCreateCompatibleDC、CreateCompatibleBitmap、SelectObjectの3つで  objectのデバイスコンテキストと互換のあるメモリ・デバイスコンテキストを  作成しています。  このメモリ・デバイスコンテキストにobjectのイメージ画像をBitBltを使って  コピー(転送)しています。つまり、新しく作られたメモリ・デバイスコンテキストは  真っ黒なのでobjectのイメージ画像でコピーしたわけ。 >DeleteObject(hNewDC); >↑あとこれはDeleteDC(hNewDC)の間違いなのでしょうか?ここも何しているか分かりません。  間違い⇒『DeleteObject(hNewDC);』  正しい⇒『DeleteDC(hNewDC);』  これはsizumさんの考えであっていると思います。  hNewDCはGDIオブジェクトではなくメモリ・デバイスコンテキストなので。 ・object->GetDC(object)関数について  この関数はobj->hBitmapがNULLなら画面(ディスプレイ全体)と互換のある  メモリ・デバイスコンテキストを作成します。  そしてobj->hBitmapがNULL以外の時はメモリ・デバイスコンテキストだけを  複製してobj->hBitmapをSelectObjectで割り付けています。  ※何にどう使うか分かりませんが、object->GetDC()関数を複数回呼び出すと  ※obj->hBitmapのハンドルを共有するようになるようです。切り替えるためかも。 ・結局_SetSize関数は >一度生成したビットマップのサイズを変更してもう一度ビットマップを生成するプログラムらしいのですが、  ↑  この通りの動作を行っているようです。  もう少し正確に(私の推測で)表現すると一度生成したメモリ上にある  ビットマップを新たなサイズで生成しなおしているようです。多分。  ※object->DeleteDC()の内容もあればもう少し正確に分かるかも正ないですね。

sizum
質問者

お礼

なるほど!画面が黒色なのでオブジェクトのイメージ画像でコピーをしていたのですね。あらためて見てみると確かにそうだと納得しました。 どうもありがとうございます^^!

関連するQ&A