プロが教える店舗&オフィスのセキュリティ対策術

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;
}

A 回答 (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()の内容もあればもう少し正確に分かるかも正ないですね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/03/15 06:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!