2012-01-16 5 views
3

Win32에서 C++로 프로젝트를 수행하면서 그려지는 이미지를 이중 버퍼링하려고했지만 정확한 비트 맵이 그려진 검은 색 화면이 나타납니다. 이것은 또한 내 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

페인트 할 때마다 백 버퍼를 리메이크해서는 안되며, 단지'WM_CREATE' (그리고'WM_SIZE')에 한 번만 만들고'SetWindowLongPtr (GWLP_USERDATA)'로'HWND'에 붙이면됩니다. – Necrolis

+3

리소스 누수가 있습니다.이 함수에서 돌아 오기 전에 hdcmem에서 DeleteObject를 호출하는 것을 잊고 있습니다. – selbie

+3

또한 EndPaint를 호출하지 못했습니다. – selbie

답변

3

다른 그래픽을 그리기 전에 배경색이 처음이라면 비트 맵을 채워야합니다. 메모리가 제대로 작동하면 비트 맵을 만들 때 비트 맵이 기본적으로 검은 색으로 채워집니다.

+0

hdcmem으로 객체를 선택한 후 다음 코드를 추가하려고 시도했습니다. \t SetBkColor (hdcmem, COLORREF RGB (0, 0, 0)); 믿음은 은 흰색이지만, 0 대신에 255로 시도해 보았습니다. 그리고 다양한 다른 숫자로, 내가 얻었던 이미지를 변경하지 않았습니다. 이것은 비트 맵의 ​​배경을 바꾸는 것이 무엇을 의미합니까, 아니면 비트 맵의 ​​컨트롤 배경을 변경하는 것과 다른가요? –

+7

'FillRect'를 통해 실제로 원하는 색상으로 채워야합니다. 'SetBkColor'는 텍스트의 배경색을 설정하지만 아무런 효과가없는 텍스트를 그리는 것처럼 보이지 않습니다. –

+2

@AaronK - RGB (0,0,0)는 흰색이 아닌 단색 검정입니다. – selbie