2011-01-05 3 views
1

Я пытаюсь быстро обновить текст, используя двойную буферизацию. Я рисую текст поверх растрового изображения и заливаю его на экран. Но текст никогда не закрывается, поскольку больше рисуется, поэтому перед тем, как это просто нечитаемый беспорядок переписанных букв. Вот моя двойная буферизация рутина:Как скрыть старый текст при двойной буферизации? - 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); 
} 

Если я делаю FillRect на bitmapBounds прямоугольника, в котором я рисую текст все хорошо, за исключением того точечного рисунка, который должен быть под текстом покроется вверх.

Спасибо.

+1

Есть ли настоящая потребность в hdcMemory2? Разве я не ошибаюсь, не могу ли вы сделать все свое внеэкранное рендеринг в hdcMemory и просто донести до DC окна? Кроме того, не лучше ли обрабатывать сообщение WM_PAINT и blit hdcMemory в этот момент, сохраняя эту функцию просто при необходимости обновляя dc памяти (а затем недействительно окно, чтобы вызвать WM_PAINT)? –

+0

@ Moo-Juice, я так думаю. Я также рисую кучу других растровых изображений с текстом на экране, но я просто дал один здесь, чтобы упростить код. WM_PAINT не будет работать для меня; Значения, которые я рисую, обновляются 10-20 раз в секунду таймером, и дисплей должен оставаться в синхронизации со значениями. Я не думаю, что события могут гарантировать точность. Для записи я не вызываю CreateCompatibleBitmap каждую ничью, я просто делаю это один раз при создании окна. – Luke

ответ

1

Я думаю, что комментарии Moo-Juice актуальны, это несколько способов, о которых вам следует подумать. Но корень вашей проблемы довольно легко объяснить.

Вы имеете право идею в целом, которое вы должны:

  1. Have поджатые фона в DC (например, hdcMemory2), так что вы не должны держать перезагрузки его.

  2. Копирование, что растровое в другой в памяти DC

  3. Розыгрыш Текст на этом DC

  4. Скопируйте новый DC на экран

Однако вы текущий код не делает что - когда вы рисуете текст в hdcMemory2 (который имеет ранее загруженный BM), это ИЗМЕНЯЕТ содержимое этого растрового изображения - это не то, что вы хотите. Чтобы заставить это работать так, как вы намереваетесь, вам нужно оставить свой hdcMemory2 без изменений, скопировать его содержимое в hdcMemory, а затем нарисовать текст на hdcMemory (таким образом сохраняя исходное изображение и только возиться с временной копией). А затем, очевидно, скопируйте его на экран.

+0

Спасибо! Я не понимал, что запись на hdcMemory2 на самом деле записывалась на загружаемом там растровом изображении. – Luke

Смежные вопросы