Я пытаюсь создать очень простое графическое приложение, используя 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);
При создании памяти DC с помощью CreateCompatibleDC
его поверхность дисплея ровно в один монохромный пиксель в ширину и в один монохромный пиксель в высоту. Следовательно при звонке CreateCompatibleBitmap
на этом DC памяти создается монохромное растровое изображение.
Поскольку растровое изображение, выбранное в контроллере памяти, контролирует цветовые характеристики, вы должны убедиться, что оно соответствует контроллеру, который вы в конечном итоге используете для отображения содержимого контроллера памяти. Для этого вам нужно передать пункт назначения CreateCompatibleBitmap
,
Исправленный код:
hdc = GetDC(hwnd);
hdcBuf = CreateCompatibleDC(hdc);
hbmpBuf = CreateCompatibleBitmap(hdc, 640, 480); // uses source DC
SelectObject(hdcBuf, hbmpBuf);
Других решений пока нет …