2012-12-28 23 views
3

我希望能夠打印兩個hdcs的東西,比如hdcBufhdcBuf2。然後我想將BitBlthdcBuf轉換爲hdcBuf2,然後將BitBlthdcBuf2轉換爲hdc,這是客戶端窗口。下面的代碼我現在有:如何一起使用三個HDC

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和HBITMAPs的是全球性的,並在WM_DESTROY妥善破壞,圖形對象是GDI +

的原因,我需要所有這些HDCS是,我需要一個物體在另一個物體上同時打印物體。我有一張平鋪的地圖,並在繪圖時循環顯示它的一部分。我需要打印瓷磚和可能在多個瓷磚上的物體,但瓷磚必須位於物體下方。只需一個hdcBuf,我需要循環兩次來完成這個工作。

現在,我的代碼只打印瓷磚上的對象hdcBuf的內容。
在此先感謝您的幫助:)

回答

0

BitBlt用提供的設備上下文覆蓋目標設備上下文的內容。 (或者說,由參數定義的區域內的內容)它不會試圖將兩個上下文「混合」在一起。因此,在您第一次致電BitBlt時,您通過hdcBuf2(破壞其內容)繪製hdcBuf的內容,然後通過hdc(也破壞其內容)繪製hdcBuf2

您需要循環遍歷地圖兩次才能完成此操作。請記住你的例子有兩個循環 - 它們只在BitBlt之內。

0

要將兩個來源混合在一起,您需要AlphaBlend函數。它與StretchBlt非常相似(與BitBlt相關,但如果不在源和目標中使用相同的大小,可以選擇調整大小)。你將不得不通過一個BLENDFUNCTION作爲如何混合的參數 - constantalpha是最簡單的方法。