
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面がチカチカする
-
Rectangleで、リソースが解放さ...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
コントロールの書式設定で、“コ...
-
エクセルで作った新しいウイン...
-
Minecraft 統合版(PC)の描画距...
-
勝手にウィンドウが開いて止ま...
-
エクセルのコントロールツール...
-
MFCでハンドルを取得するには
-
ラジオボタンの初期指定
-
スピンボタンを右クリックして...
-
confirmダイアログの表示文字に...
-
VB.NET2005 TextBox 高さ(Heig...
-
コンボボックス内の文字サイズ変更
-
Swingで作ったウィンドウの最小...
-
マインクラフト(pc版)で座標...
-
word
-
ちらつきについて
-
他のウィンドウのボタンを自動...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
メモリデバイスコンテキストを...
-
画面がチカチカする
-
Windowsプログラミング 画面描...
-
Rectangleで、リソースが解放さ...
-
ダイアログにビットマップを貼...
-
VBでデスクトップアクセサリを...
-
ちらつきについて
-
画像処理 ビットマップ ダブ...
-
C 多角形を半透明に塗る方法
-
VC++でopenGLを利用したい...。
-
ハードコピーをプログラムから...
-
WindowsAPIでの画像表示について
-
SetWindowRgn()関数について。
-
WinAPIでスクリーン画像を映し...
-
ビットマップの表示について
-
VC++のTextOutの再描画の仕方
-
ダブルバッファの作り方
-
usbデバイスとの通信
-
BitBlt関数について教えてください
おすすめ情報