2012-01-16 67 views
3

在C++中做win32項目,嘗試對正在繪製的圖像進行雙緩衝,但是我得到一個黑色的屏幕,並在其上繪製了正確的位圖。這也會導致我的WM_MOUSEMOVE條件,該條件拖動位圖和光標一起不繪製位圖。繪製代碼如下:paint()在WM_PAINT下的wndproc中調用,scroll是滾動條的位置,目前尚未使用。Win32雙緩衝繪製黑色背景

int paint(HWND hWnd, HINSTANCE hInst, RECT clientRect, std::vector<Measure> *measures, int scroll) 
{ 
int x = 90; 
hdc = BeginPaint(hWnd, &ps); 
hdcmem = CreateCompatibleDC(hdc); 
HBITMAP hbmScreen = CreateCompatibleBitmap(hdc, clientRect.right, clientRect.bottom); 
SelectObject(hdcmem,hbmScreen); 
/*these functions just create the bitmaps into hdcmem*/ 
drawStaff(hWnd, hInst, clientRect, x, 0); 
drawKey(hWnd, hInst, clientRect, x, (*measures)[0], 0); 
drawTime(hWnd, hInst, clientRect, x, (*measures)[0], 0); 
drawNotes(hWnd, hInst, clientRect, measures, x); 
    BitBlt(hdc, 0, 0, clientRect.right, clientRect.bottom, hdcmem, 0, 0, SRCCOPY); 
ReleaseDC(hWnd, hdcmem); 
return 0; 
} 
+3

你不應該在你繪製的時候重新制作backbuffer,只需在WM_CREATE(和WM_SIZE)上創建一次,然後用'SetWindowLongPtr(GWLP_USERDATA)'將它附加到'HWND'上。 – Necrolis 2012-01-16 07:23:14

+3

你有一個資源泄漏 - 你忘了在從這個函數返回之前調用hdcmem上的DeleteObject。 – selbie 2012-01-16 08:23:59

+3

你也沒有打電話給EndPaint。 – selbie 2012-01-16 08:26:21

回答

3

您需要在繪製其他圖形之前用任何背景顏色填充位圖。如果內存正確地爲我提供服務,則默認情況下位圖會在創建時填充爲黑色。

+0

在將對象選入hdcmem後,我嘗試添加以下代碼: \t SetBkColor(hdcmem,COLORREF RGB(0,0,0)); 這是相信是白色的,但我也嘗試了255而不是0,然後其他各種數字,其中沒有一個改變了我得到的圖像。這是你通過改變位圖的背景意味着什麼,或者是不同於改變位圖控件的背景嗎? – 2012-01-16 03:29:43

+7

你實際上必須填寫你想要的顏色,比如說通過FillRect。 'SetBkColor'爲文本設置背景顏色,但是你不會畫任何文本,所以調用沒有效果。 – 2012-01-16 03:42:26

+2

@AaronK - RGB(0,0,0)是純黑色,不是白色! – selbie 2012-01-16 08:25:07