GDI + Double Buffering: двухцветный бэкбуфер

Я пытаюсь создать очень простое графическое приложение, используя C ++, Windows API и GDI +. При первой попытке создать приложение появилось сильное мерцание, поэтому этот код пытается использовать двойную буферизацию, но терпит неудачу. hdcBuf — это буфер.

При попытке нарисовать что-либо в буферном буфере с помощью GDI + Graphics :: DrawCachedBitmap растровое изображение рисуется двухцветным в черно-белом режиме.

LoadBitmapRes создает CachedBitmap из ресурсов EXE; эта функция работает с одиночной буферизацией.

Что-то не так в коде? Заранее спасибо!

Глобальный:

CachedBitmap* fish;
HDC hdc;
HDC hdcBuf;
HBITMAP hbmpBuf;
Graphics* gfxBuf;

WM_CREATE:

hdc = GetDC(hwnd);
hdcBuf = CreateCompatibleDC(hdc);
hbmpBuf = CreateCompatibleBitmap(hdcBuf, 640, 480);
SelectObject(hdcBuf, hbmpBuf);
gfxBuf = Graphics::FromHDC(hdcBuf);
fish = LoadBitmapRes(gfxBuf, MAKEINTRESOURCE(FISH2), "SPRITE");

WM_PAINT:

HDC temp = BeginPaint(hwnd, &ps);
gfxBuf->DrawCachedBitmap(fish, x, y);
BitBlt(temp, 0, 0, 640, 480, hdcBuf, 0, 0, SRCCOPY);
EndPaint(hwnd, &ps);

3

Решение

При создании памяти DC с помощью CreateCompatibleDC его поверхность дисплея ровно в один монохромный пиксель в ширину и в один монохромный пиксель в высоту. Следовательно при звонке CreateCompatibleBitmap на этом DC памяти создается монохромное растровое изображение.

Поскольку растровое изображение, выбранное в контроллере памяти, контролирует цветовые характеристики, вы должны убедиться, что оно соответствует контроллеру, который вы в конечном итоге используете для отображения содержимого контроллера памяти. Для этого вам нужно передать пункт назначения CreateCompatibleBitmap,

Исправленный код:

hdc = GetDC(hwnd);
hdcBuf = CreateCompatibleDC(hdc);
hbmpBuf = CreateCompatibleBitmap(hdc, 640, 480); // uses source DC
SelectObject(hdcBuf, hbmpBuf);
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]