문제

다음 코드를 실행 중입니다.

HDC hdc;
HDC hdcMem;
HBITMAP bitmap;
RECT c;
GetClientRect(viewHandle, &c);
// instead of BeginPaint use GetDC or GetWindowDC
hdc = GetDC(viewHandle); 
hdcMem = CreateCompatibleDC(hdc); 
// always create the bitmap for the memdc from the window dc
bitmap = CreateCompatibleBitmap(hdc,c.right-c.left,200);

SelectObject(hdcMem, bitmap);

// only execute the code up to this point one time
// that is, you only need to create the back buffer once
// you can reuse it over and over again after that

// draw on hdcMem
// for example  ...
Rectangle(hdcMem, 126, 0, 624, 400);

// when finished drawing blit the hdcMem to the hdc
BitBlt(hdc, 0, 0, c.right-c.left,200, hdcMem, 0, 0, SRCCOPY);

// note, height is not spelled i before e

// Clean up - only need to do this one time as well
DeleteDC(hdcMem);
DeleteObject(bitmap);
ReleaseDC(viewHandle, hdc);

코드는 괜찮습니다.그런데 이 직사각형 주위에 검은색이 보입니다.왜 그런 겁니까? 다음은 예시 이미지입니다.

도움이 되었습니까?

해결책

비트맵은 모두 검은색으로 초기화될 가능성이 높습니다.그런 다음 x 좌표 126과 624 사이에 흰색 직사각형을 그립니다.따라서 x=126의 왼쪽과 x=624의 오른쪽에 있는 모든 것은 검은색으로 유지됩니다.

편집하다:그만큼 문서화 CreateCompatibleBitmap 비트맵이 어떻게 초기화되는지 명시하지 않으므로 Goz가 제안한 대로 다음을 사용하여 특정 색상으로 비트맵을 명시적으로 초기화해야 합니다. FillRect:

RECT rc;

rc.left=0;
rc.top=0;
rc.right=c.right-c.left;
rc.bottom=200;

FillRect(hdcMem, &rc, (HBRUSH)GetStockObject(GRAY_BRUSH));

이 예에서는 비트맵을 회색으로 채웁니다. CreateSolidBrush 다른 색상이 필요한 경우 나만의 브러시를 사용하세요.(전화하는 것 잊지 마세요. DeleteObject 다 끝나면.)

참고로, 비트맵이 일정한 높이 200으로 설정되어 있다는 것이 조금 이상하다고 생각합니다. 일반적으로 비트맵의 높이를 창의 높이와 동일하게 만드는 것입니다. 너비).

다른 팁

메모리 비트 맵 영역을 주어진 색상으로 초기화하지 않았기 때문일 수 있습니까? 배경을 다른 색상으로 채우고 흰색 사각형을 그 위에 끌어 내고 무슨 일이 일어나는지 확인하십시오.

MSDN 당 http://msdn.microsoft.com/en-us/library/dd162898.aspx:

사각형은 현재 펜을 사용하여 요약되며 현재 브러시를 사용하여 채워집니다.

전화를 고려하십시오 FillRect 대신, 또는 전화하기 전에 적절한 펜을 선택하십시오. Rectangle'.

나는 사용했다 :

    // Fill the background
    hdcMem->FillSolidRect(c, hdcMem->GetBkColor());

메모처럼.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top