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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スクリーンキャプチャをウイン...
-
コントロール内の文字の背景色
-
VC++のTextOutの再描画の仕方
-
領域を塗りつぶしたい
-
ダイアログにビットマップを貼...
-
BeginPaintの使い方
-
VBでFD、USBの有効・無効...
-
エクセルで作った新しいウイン...
-
コントロールの書式設定で、“コ...
-
「アイテムは収集されました」...
-
コンボボックス内の文字サイズ変更
-
グラフの交点の求め方(Excel)
-
VBAのフォント変更(エクセルか...
-
フォントの大きさ
-
3次元空間上の2つの座標から...
-
【C#】別フォームも同時に閉じ...
-
vbaから他のアプリを終了
-
マインクラフト(pc版)で座標...
-
エクセルのコントロールツール...
-
VB.NET2005 TextBox 高さ(Heig...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
画面がチカチカする
-
VC++のTextOutの再描画の仕方
-
コントロール内の文字の背景色
-
ビットマップ(表示速度とサイズ)
-
VBでFD、USBの有効・無効...
-
Rectangleで、リソースが解放さ...
-
WinAPIでスクリーン画像を映し...
-
メモリデバイスコンテキストを...
-
クライアント領域をCBitmapに取...
-
ダブルバッファの作り方
-
VC++でopenGLを利用したい...。
-
C 多角形を半透明に塗る方法
-
Win32APIにて、アイコンの情報...
-
ExtTextOut
-
TextOutについて
-
ハードコピーをプログラムから...
-
Windowsプログラミング 画面描...
-
BeginPaintの使い方
-
デバイスコンテキストの宣言に...
おすすめ情報