Сообщения WM_PAINT продолжают отправляться до тех пор, пока Windows не проверит грязную область окна. API, который сбрасывает грязную область, называется «EndPaint».
Вызов SwapBuffers не должен влиять на недопустимую область окна.
Ваш обработчик WM_PAINT должен выглядеть примерно так:
case WM_PAINT:
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint(hwnd,&ps);
wglMakeCurrent(hdc,scene.m_oglContext);
scene.Render(); //
wglSwapBuffers(hdc);
wglMakeCurrent(hdc,0);
EndPaint(hwnd,&ps);
return 0;
Множество примеров кода для программирования Open GL имеют одну настройку контекста HDC и OpenGL при запуске приложения. Хотя это упрощает пример кода, это означает, что код не может корректно работать с несколькими контекстами OpenGL. Этот обработчик WM_PAINT предполагает, что контекст OpenGL создается для сцены, а затем обновляется по мере необходимости.
Побочным эффектом замены контекста OpenGL по мере необходимости является то, что hdc, полученный из BeginPaint, используется в качестве цели рендеринга (и SwapBuffer), что означает, что приложение OpenGL теперь будет рисовать синхронно, если и когда другие окна перетаскиваются поверх Окно приложения.