3

最近これについて質問したところ、答えは理解できましたが、コードに変換できませんでした。ものをいじって、漏れを修正する別の日の後。しかし、私は文字通り私の人生でこれを理解することはできません.

これは少し異なります。マップ ビットマップの下にある背景ビットマップを取得するだけです。私が持っているもの

HDC hdc = GetDC(hWnd);
HDC hdcMem = CreateCompatibleDC(hdc);
HDC hdcMem2 = CreateCompatibleDC(hdc);
ReleaseDC(hWnd, hdc);

HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmBackground);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCCOPY);       

HBITMAP hbmOld2 = (HBITMAP)SelectObject(hdcMem2, bitmap.hbmMap);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem2, 0, 0, SRCPAINT); 

SelectObject(hdcMem2, hbmOld2);

私の問題は組み合わせです...ラスター操作の結果を保持するためにメモリDCを作成します。私はこれに頭を悩ませることはできません。どんな助けも素晴らしいでしょう。

ありがとう。

4

1 に答える 1

5

おそらく、これの最も難しい部分は、中央の長方形です。マスク内の他の白い領域は、背景が透けて見える場所ですが、その長方形の内側には、背景が透けて見えない白い部分があります。

とりあえず、これらのセクションを異なる色で開始できると仮定します。透明部分 (背景が表示される部分) に使用する色は、それが一意である限り、実際には問題ではありません。今のところ、254、254、254 の RGB 値であると想定します。コードは純粋な白 (255、255、255) と間違えませんが、通常は視覚的に区別できません。

これにより、作業は非常に簡単になります。TransparentBlt を使用して透明度を処理できるため、BitBlt を使用して背景を宛先にブリットし、TransparentBlt を使用してその宛先にマスクをブリットします。少し単純化すると (当面はあまり気にしないパラメーターを省略します)、コードは次のようになります。

HDC mask, background, combined;

mask =       CreateCompatibleDC(screen);
background = CreateCompatibleDC(screen);
combined =   CreateCompatibleDC(screen);

HBITMAP mask_bmp = LoadBitmap(MAKEINTRESOURCE(IDB_MASK));
HBITMAP back_bmp = LoadBitmap(MAKEINTRESOURCE(IDB_BKGND));
HBITMAP result = CreateCompatibleBitmap(screen);

mask_original = Selectobject(mask, mask_bmp);
back_original = SelectObject(background, back_bmp);
combined_original = SelectObject(combined, result);

BitBlt(background, result, SRCCOPY);
TransparentBlt(mask, result, RGB(254, 254, 254));

BitBlt(result, screen, SRCCOPY);

SelectObject(mask, mask_original);
SelectObject(background, back_original);
SelectObject(combined, combined_original);

DeleteDC(mask);
DeleteDC(background);
DeleteDC(combined):
DeleteObject(result);
于 2014-02-14T09:08:56.333 に答える