2014-02-09 83 views
1

本帖子底部的已更新 我正在做的是試圖使用一個黑色和白色位圖,在白色奠定一個背景位圖,並在黑色鋪貼瓷磚。我遇到的問題是添加覆蓋。Win32 C++ BitBlt透明度

This is all the parts

,這是我的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」,但似乎做同樣的事情無論哪種方式。

透明blt函數在這裏也不能完全滿足要求。

謝謝。

我一直有麻煩組合和rastoring

。我可以稍微處理DC和位圖,但這是我不知道如何做的一件事......創建內存dcs,並使用dcs保存位圖,使用dc作爲另一個位圖,然後使用bitblt保存到mem。我認爲...

繼承人我的冗餘代碼,我現在有。真的,我需要幫助與僞代碼,如何結合位圖...多少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); 
+0

http://www.winprog.org/tutorial/transparency.html – Brandon

回答

3

結合hbmpBackground使用SRCAND hbmMap,正如您在3

做用倒置hbmMap結合hbmMapOverlay(SRCINVERT應該這樣做)。

使用OR(SRCPAINT)

+0

感謝您的回覆,我在主帖底部更新了我的代碼/問題。我有一點(沒有雙關語意),與區議會有關 –

1

雖然這可以BitBlt完成合並這兩個結果,它通常是相當多的更容易使用PlgBlt

以背景位圖開始BitBlt到目的地。然後調用PlgBlt,將它傳遞給前景位圖和蒙版。