더블 버퍼링을 사용하여 텍스트를 빠르게 업데이트하려고합니다. 비트 맵 위에 텍스트를 그려 화면에 블릿합니다. 그러나 텍스트는 더 많이 그려지기 때문에 덮어 쓰여지지 않습니다. 그래서 겹쳐 쓰여진 편지의 읽을 수없는 뒤죽박죽입니다. 나는 모든 텍스트가 은폐됩니다 아래에 있어야하는데 비트 맵 것을 제외하고 잘 텍스트를 그리기있어하는 bitmapBounds 사각형에 fillRect 할을 할 경우더블 버퍼링을 할 때 어떻게 이전 텍스트를 은폐합니까? - Win32 C++
void PaintControlWindow()
{
HDC hdc,hdcMemory;
RECT rect;
HBITMAP bitmap;
HBRUSH backgroundBrush;
hdc = GetDC(windowHwnd); //windowHwnd is a valid global
GetClientRect(windowHwnd,&rect);
hdcMemory = CreateCompatibleDC(hdc);
bitmap = CreateCompatibleBitmap(hdc, 800, 600);
backgroundBrush = CreateSolidBrush(RGB(200,189,156));
SelectObject(hdcMemory, bitmap);
FillRect(hdcMemory,&rect,backgroundBrush);
HDC hdcMemory2 = CreateCompatibleDC(hdcMemory);
SelectObject(hdcMemory2,previouslyLoadedBitmap);
SelectObject(hdcMemory2,previouslyCreatedFont);
DrawTextEx(hdcMemory2,sometext,strlen(sometext),&bitmapBounds,DT_CENTER | DT_SINGLELINE, NULL);
BitBlt(hdcMemory, bitmapBounds.left, bitmapBounds.top, bitmapBounds.right, bitmapBounds.bottom, hdcMemory2, 0,0, SRCCOPY);
DeleteDC(hdcMemory2);
BitBlt(hdc, rect.left, 0, rect.right, rect.bottom, hdcMemory, rect.left, 0, SRCCOPY);
DeleteDC(hdcMemory);
DeleteObject(bitmap);
DeleteObject(backgroundBrush);
ReleaseDC(windowHwnd,hdc);
}
: 여기 내 이중 버퍼링 루틴입니다.
감사합니다.
hdcMemory2가 실제로 필요합니까? 내가 틀린 것이 아니라면 hdcMemory에서 모든 오프 스크린 렌더링을 수행하고 윈도우의 DC로 blit을 블릿 할 수는 없습니까? 또한, 그 시점에서 WM_PAINT 메시지와 blit hdcMemory를 처리하는 것이 더 좋지 않은가? 필요한 경우 메모리 dc를 업데이트하기 위해이 함수를 유지하고 WM_PAINT를 발생시키는 창을 무효화 할 것인가? –
@ Moo-Juice, 그렇게 생각합니다. 또한 텍스트가있는 다른 비트 맵을 화면에 표시하고 있지만 코드를 단순화하기 위해 여기에 텍스트를 제공했습니다. WM_PAINT는 나를 위해 작동하지 않습니다; 내가 그린 그림의 값은 타이머에 의해 초당 10-20 번 업데이트되며 디스플레이는 값과 동기화 상태를 유지해야합니다. 나는 사건이 그 정확성을 보장 할 수 있다고 생각하지 않는다. 레코드의 경우 CreateCompatibleBitmap을 각각의 Draw라고 부르지 않습니다. 창 생성시 한 번만 수행합니다. – Luke