2

この投稿の下部で更新 された外観 私がやっていることは、1 つの白黒ビットマップを使用して、白の上に背景ビットマップを配置し、黒の上にタイル オーバーレイを配置しようとしていることです。私が抱えている問題は、オーバーレイを追加することです。

これで全パーツです

これが私の BitBlt() コードです。このコードは #5 を生成します。

hOldBitmap = (HBITMAP)SelectObject(hdcMem, bitmap.hbmBackground); // #2
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCCOPY); 

hOldBitmap = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMap); // #1
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCAND);

hOldBitmap = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMapOverlay); // #4
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCAND);   

同じ「hOldBitmp」を使用するかどうかはわかりませんが、どちらの方法でも同じことを行うようです。

ここでも、transparent blt 関数は完全には十分ではありません。

ありがとう。

新着

結合とラストアリングに問題がありました。私はDCとビットマップをある程度処理できますが、これは私が行う方法を理解できないことの1つです...メモリDCを作成し、DCをビットマップを保持し、DCを別のビットマップに、次にbitbltをメモリに作成します。おもう...

現時点で私が持っている冗長なコードを次に示します。本当に、疑似コード、ビットマップの結合方法、必要な DC の数などについて助けが必要です。

buffer.getBufferDC() は、画面に表示されるメイン DC です。

HDC hdc = GetDC(hWnd);
HDC hdcMem = CreateCompatibleDC(hdc);
HDC hdcMem2 = CreateCompatibleDC(hdc);
HDC hdcMem3 = CreateCompatibleDC(hdc);
HDC hdcMem4 = CreateCompatibleDC(hdc);
HBITMAP hbmMem3 = CreateCompatibleBitmap(hdc, WINDOW_WIDTH, WINDOW_HEIGHT);
HBITMAP hbmMem4 = CreateCompatibleBitmap(hdc, WINDOW_WIDTH, WINDOW_HEIGHT);
ReleaseDC(hWnd, hdc);

// Copy the map and clean the hdcMem
HBITMAP hbmOld;
hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMap);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCCOPY);    
SelectObject(hdcMem, hbmOld);
hbmOld = (HBITMAP)SelectObject(hdcMem2, bitmap.hbmBackground);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem2, 0, 0, SRCAND);    
SelectObject(hdcMem2, hbmOld);     

hbmOld = (HBITMAP)SelectObject(hdcMem3, bitmap.hbmMapOverlay);
hbmOld = (HBITMAP)SelectObject(hdcMem4, bitmap.hbmMap);
BitBlt(hdcMem3, 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem4, 0, 0, SRCINVERT);

BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem3, 0, 0, SRCPAINT);     
//hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMap);
//BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCPAINT);    
//SelectObject(hdcMem, hbmOld);


//hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMapOverlay);
//BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCAND);    
//SelectObject(hdcMem, hbmOld);    

DeleteDC(hdcMem);
DeleteDC(hdcMem2);
DeleteDC(hdcMem3);
DeleteDC(hdcMem4);
4

2 に答える 2

4

3 で行ったように、SRCAND を使用して hbmpBackground を hbmMap と結合します。

hbmMapOverlay を反転された hbmMap と結合します (SRCINVERT で実行する必要があります)。

OR (SRCPAINT) を使用してこれら 2 つの結果を結合します。

于 2014-02-09T22:20:10.990 に答える
1

これは で実行できますがBitBlt、通常は を使用する方がかなり簡単PlgBltです。

BitBlt背景ビットマップを宛先に ing することから始めます。次に を呼び出しPlgBlt、フォアグラウンド ビットマップとマスクの両方を渡します。

于 2014-02-10T03:17:07.843 に答える