2011-01-05 3 views
1

더블 버퍼링을 사용하여 텍스트를 빠르게 업데이트하려고합니다. 비트 맵 위에 텍스트를 그려 화면에 블릿합니다. 그러나 텍스트는 더 많이 그려지기 때문에 덮어 쓰여지지 않습니다. 그래서 겹쳐 쓰여진 편지의 읽을 수없는 뒤죽박죽입니다. 나는 모든 텍스트가 은폐됩니다 아래에 있어야하는데 비트 맵 것을 제외하고 잘 텍스트를 그리기있어하는 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); 
} 

: 여기 내 이중 버퍼링 루틴입니다.

감사합니다.

+1

hdcMemory2가 실제로 필요합니까? 내가 틀린 것이 아니라면 hdcMemory에서 모든 오프 스크린 렌더링을 수행하고 윈도우의 DC로 blit을 블릿 할 수는 없습니까? 또한, 그 시점에서 WM_PAINT 메시지와 blit hdcMemory를 처리하는 것이 더 좋지 않은가? 필요한 경우 메모리 dc를 업데이트하기 위해이 함수를 유지하고 WM_PAINT를 발생시키는 창을 무효화 할 것인가? –

+0

@ Moo-Juice, 그렇게 생각합니다. 또한 텍스트가있는 다른 비트 맵을 화면에 표시하고 있지만 코드를 단순화하기 위해 여기에 텍스트를 제공했습니다. WM_PAINT는 나를 위해 작동하지 않습니다; 내가 그린 그림의 값은 타이머에 의해 초당 10-20 번 업데이트되며 디스플레이는 값과 동기화 상태를 유지해야합니다. 나는 사건이 그 정확성을 보장 할 수 있다고 생각하지 않는다. 레코드의 경우 CreateCompatibleBitmap을 각각의 Draw라고 부르지 않습니다. 창 생성시 한 번만 수행합니다. – Luke

답변

1

Moo-Juice의 의견은 당신이 생각해야하는 몇 가지 방법이라고 생각합니다. 그러나 문제의 근원은 설명하기가 쉽습니다. 당신이 그것을 다시로드 유지 할 필요가 없도록

  1. (예 : hdcMemory2 등) DC에서 사전로드 된 배경 유무 :

    당신은 당신이해야입니다 일반적으로 올바른 생각을 가지고있다. 이 DC

  2. 복사 새로운 DC에

  3. 그리기 텍스트 화면에 DC 메모리에 다른에 비트 맵

  4. 복사

당신은 현재의 코드를하지 않는다 그러나 그 - hdcMemory2 (이전에로드 된 BM이있는)에 텍스트를 그릴 때이 비트 맵의 ​​내용이 변경됩니다. 이는 원하는 바가 아닙니다. hdcMemory2를 변경하지 않고 그대로 사용하려면 hdcMemory에 내용을 복사 한 다음 hdcMemory에 텍스트를 그립니다 (따라서 원본 이미지는 보존하고 임시 복사본 만 남김). 그리고 분명히 그것을 화면에 복사하십시오.

+0

감사합니다! hdcMemory2에 쓰기가 실제로 거기에로드 된 비트 맵에 쓰고 있다는 것을 깨닫지 못했습니다. – Luke

관련 문제