Я пытаюсь быстро обновить текст, используя двойную буферизацию. Я рисую текст поверх растрового изображения и заливаю его на экран. Но текст никогда не закрывается, поскольку больше рисуется, поэтому перед тем, как это просто нечитаемый беспорядок переписанных букв. Вот моя двойная буферизация рутина:Как скрыть старый текст при двойной буферизации? - 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 прямоугольника, в котором я рисую текст все хорошо, за исключением того точечного рисунка, который должен быть под текстом покроется вверх.
Спасибо.
Есть ли настоящая потребность в hdcMemory2? Разве я не ошибаюсь, не могу ли вы сделать все свое внеэкранное рендеринг в hdcMemory и просто донести до DC окна? Кроме того, не лучше ли обрабатывать сообщение WM_PAINT и blit hdcMemory в этот момент, сохраняя эту функцию просто при необходимости обновляя dc памяти (а затем недействительно окно, чтобы вызвать WM_PAINT)? –
@ Moo-Juice, я так думаю. Я также рисую кучу других растровых изображений с текстом на экране, но я просто дал один здесь, чтобы упростить код. WM_PAINT не будет работать для меня; Значения, которые я рисую, обновляются 10-20 раз в секунду таймером, и дисплей должен оставаться в синхронизации со значениями. Я не думаю, что события могут гарантировать точность. Для записи я не вызываю CreateCompatibleBitmap каждую ничью, я просто делаю это один раз при создании окна. – Luke