3

hdcBufと言う2つのhdcsに物事を印刷できるようにしたいhdcBuf2。次に、クライアント ウィンドウである に移動しBitBlt hdcBufます。これが私が今持っているコードです:hdcBuf2BitBlt hdcBuf2hdc

hdc = GetDC(hWnd);

hdcBuf2 = CreateCompatibleDC(hdc);
hbmBackBM2 = CreateCompatibleBitmap(hdc, client.right, client.bottom);
hbmOldBackBM2 = (HBITMAP)SelectObject(hdcBuf2, hbmBackBM2);

hdcBuf = CreateCompatibleDC(hdcBuf2); 
hbmBackBM = CreateCompatibleBitmap(hdcBuf2, client.right, client.bottom);
hbmOldBackBM = (HBITMAP)SelectObject(hdcBuf, hbmBackBM);
Graphics g(hdcBuf);
Graphics g2(hdcBuf2);
//drawing stuff with both g and g2
BitBlt(hdcBuf2,0,0,client.right,client.bottom,hdcBuf,0,0,SRCCOPY);
BitBlt(hdc,0,0,client.right,client.bottom,hdcBuf2,0,0,SRCCOPY);

すべての HDC と HBITMAP はグローバルであり、WM_DESTROY で適切に破棄され、グラフィック オブジェクトは GDI+ です。

これらすべての hdcs が必要な理由は、あるオブジェクトを別のオブジェクトの上に同時に印刷する必要があるからです。タイル マップがあり、描画時にその一部をループします。タイルと、複数のタイルにある可能性のあるオブジェクトを印刷する必要がありますが、タイルはオブジェクトの下にある必要があります。hdcBuf が 1 つだけの場合、これを行うにはマップを 2 回ループする必要があります。

現在、私のコードはhdcBuf、タイル上のオブジェクトのコンテンツのみを出力します。
よろしくお願いします:)

4

2 に答える 2

0

2 つのソースを一緒にミックスするには、AlphaBlend関数が必要です。これは、StretchBlt とほとんど同じように使用されます (BitBlt に関連していますが、ソースと宛先で同じサイズを使用しない場合にサイズを変更するオプションがあります)。ブレンドする方法のパラメーターとしてBLENDFUNCTIONを渡す必要があります。constantalphaが最も簡単な方法です。

于 2012-12-28T20:15:07.473 に答える
0

BitBltターゲット デバイス コンテキストの内容を、指定されたデバイス コンテキストで上書きします。(というか、パラメータで定義された領域内のコンテンツ) 2 つのコンテキストを「混ぜ合わせる」ことはしません。したがって、 の最初の呼び出しでは、 overBitBltの内容を描画し(その内容を破棄します)、次にoverを描画します(内容も破棄します)。hdcBufhdcBuf2hdcBuf2hdc

これを行うには、マップを 2 回ループする必要があります。あなたの例にも 2 つのループがあることに注意してくださいBitBlt

于 2012-12-28T19:44:28.723 に答える