
static VOID _SetSize(pLayer object, LONG w, LONG h)
{
LayerEx * obj;
obj = (LayerEx *)object;
obj->size.x = w;
obj->size.y = h;
if(obj->hBitmap){
HDC hdc , hNewDC;
HBITMAP hNewBitmap;
hdc = object->GetDC(object);
hNewDC = CreateCompatibleDC(hdc);
hNewBitmap = CreateCompatibleBitmap(hdc , w , h);
SelectObject(hNewDC , hNewBitmap);
BitBlt(hNewDC , 0 , 0 , w , h , hdc , 0 , 0 , SRCCOPY);
DeleteObject(hNewDC);
object->DeleteDC(object , hdc);
DeleteObject(obj->hBitmap);
obj->hBitmap = hNewBitmap;
}
一度生成したビットマップのサイズを変更してもう一度ビットマップを生成するプログラムらしいのですが、
BitBlt(hNewDC , 0 , 0 , w , h , hdc , 0 , 0 , SRCCOPY);
↑なぜBitBltで転送しているのかわかりません。
新しく生成したビットマップをSelectObjectで登録したらいいような感じがするんですが・・・
DeleteObject(hNewDC);
↑あとこれはDeleteDC(hNewDC)の間違いなのでしょうか?ここも何しているか分かりません。
分かる人いたら教えてください。説明足りなかったらごめんなさい^^;
↓一応object->GetDC(object)のソースです。
static HDC _GetDC(pLayer layer)
{
LayerEx * obj;
HDC hResult;
obj = (LayerEx *)layer;
if(obj->hBitmap == NULL){
HDC hdc;
hdc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
obj->hBitmap = CreateCompatibleBitmap(hdc, obj->size.x, obj->size.y);
hResult = CreateCompatibleDC(hdc);
SelectObject(hResult, obj->hBitmap);
DeleteDC(hdc);
}
else{
hResult = CreateCompatibleDC(NULL);
SelectObject(hResult, obj->hBitmap);
}
return hResult;
}
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()の内容もあればもう少し正確に分かるかも正ないですね。
なるほど!画面が黒色なのでオブジェクトのイメージ画像でコピーをしていたのですね。あらためて見てみると確かにそうだと納得しました。
どうもありがとうございます^^!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- 飛行機・空港 ミルウォーキーツールHDC大阪から伊丹空港へ乗り換え無しで行く方法はありますか? できれば、空港直通 2 2023/05/12 06:44
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
- その他(プログラミング・Web制作) pythonで変数にオブジェクトを代入するにはどうしたらよいでしょうか 2 2023/08/20 20:36
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ちらつきについて
-
Windowsプログラミング 画面描...
-
ビットマップの表示について
-
グラフの交点の求め方(Excel)
-
Minecraft 統合版(PC)の描画距...
-
コントロールの書式設定で、“コ...
-
エクセルで作った新しいウイン...
-
WINAPI 他のウインドウを重ね...
-
pygameで画像を描画する方法を...
-
TreeView表示がおかしいです。
-
リッチテキストのフォント
-
表示する方法
-
Paint Shop Pro で
-
勝手にウィンドウが開いて止ま...
-
仮想メモリが移動できない
-
リストコントロールの文字の大...
-
ウインドウが閉じたことを知る方法
-
ExcelVBA上で特定の座標への画...
-
PCで細かな目盛りを作図する方...
-
「アイテムは収集されました」...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
PlgBltでの透過
-
OpenGLでウィンドウハンドルの取得
-
メモリデバイスコンテキストを...
-
GetDC()とCreateCompatibleDC()
-
ちらつきについて
-
VBでFD、USBの有効・無効...
-
Active Basic デバイスコンテ...
-
ExtTextOut
-
デバイスコンテキストとデバイ...
-
VC++のTextOutの再描画の仕方
-
画面がチカチカする
-
ハードコピーをプログラムから...
-
メモリデバイスコンテキスト&...
-
C++でBMP解析
-
C 多角形を半透明に塗る方法
-
領域を塗りつぶしたい
-
コントロール内の文字の背景色
-
GetPixelに使うHDCの作り方
-
丸いボタンの表示でCPU100%
おすすめ情報