gdi — Двойная буферизация? Переполнение стека в Win32

Я пытаюсь реализовать двойную буферизацию, но она, похоже, не работает, то есть графика все еще мигает.

WM_PAINT вызывается каждый раз, когда движется мышь. (WM_MOUSEMOVE)

Вставил WM_PAINT ниже:

case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rect;
GetClientRect(hWnd, &rect);
int width=rect.right;
int height=rect.bottom;

HDC backbuffDC = CreateCompatibleDC(hdc);

HBITMAP backbuffer = CreateCompatibleBitmap( hdc, width, height);

int savedDC = SaveDC(backbuffDC);
SelectObject( backbuffDC, backbuffer );
HBRUSH hBrush = CreateSolidBrush(RGB(255,255,255));
FillRect(backbuffDC,&rect,hBrush);
DeleteObject(hBrush);if(fileImport)
{
importFile(backbuffDC);
}

if(renderWiredCube)
{
wireframeCube(backbuffDC);
}

if(renderColoredCube)
{
renderColorCube(backbuffDC);

}

BitBlt(hdc,0,0,width,height,backbuffDC,0,0,SRCCOPY);
RestoreDC(backbuffDC,savedDC);

DeleteObject(backbuffer);
DeleteDC(backbuffDC);

EndPaint(hWnd, &ps);
}

7

Решение

Добавьте следующий обработчик:

case WM_ERASEBKGND:
return 1;

Это работает потому, что это сообщение отправляется перед рисованием, чтобы гарантировать, что рисование выполняется на фоне класса окна. Мигание идет назад и вперед между фоном и тем, что закрашено над ним. Как только фон перестает быть закрашенным, он перестает конфликтовать с тем, что закрашивается, что включает в себя заполнение окна сплошным цветом, так что фон все равно останется.

9

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

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

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