Проблема с фокусировкой окна - PullRequest
0 голосов
/ 18 ноября 2011

В настоящее время я программирую графическое приложение с OpenGL и Windows API на C ++.К сожалению, изображение зависает при определенных условиях, например, когда я изменяю размер окна и / или когда моя мышь не движется.Есть ли какой-то механизм, который я могу использовать в Win32, чтобы гарантировать, что кадры постоянно обрабатываются?

Вот некоторый псевдокод, описывающий основной поток моей программы

Main Loop

while(running)
{
    if (PeekMessage(&Msg,NULL,0,0,PM_REMOVE))   
    {
        if (Msg.message==WM_QUIT)               
        {
            SetRunning(false);                  
        }
        else                                    
        {
            TranslateMessage(&Msg);             
            DispatchMessage(&Msg);              
        }
    }
    else
    {
        SwapBuffers(deviceContext);
    }
}

WndProc

switch(msg)
{

case WM_CLOSE:
{
    PostQuitMessage(0);
    break;
}

case WM_SIZE:
{
    ResizeScreen(LOWORD(lParam),HIWORD(lParam));
    break;
}

}

return DefWindowProc(hwnd, msg, wParam, lParam);

РЕДАКТИРОВАТЬ: я прочитал учебник Kol, связанный с и внес некоторые изменения, и теперь частота кадров остается неизменной, даже когда мышь не движется.Однако изображение по-прежнему замирает, когда я перемещаю окно или изменяю его размер, поэтому буду признателен за помощь.

1 Ответ

1 голос
/ 18 ноября 2011

Прочтите NeHe сайт , чтобы изучить основы OpenGL с Win32. Там - подробные объяснения того, как должен выглядеть цикл сообщений, что должен делать обработчик WM_SIZE и т. Д.

EDIT

Код, который рисует сцену и замену буфера, должен быть помещен в цикл сообщений, в ветку else после ветви if (PeekMessage(...)). Посмотрите, где находится вызов DrawGLScene() в приведенном выше примере NeHe.

EDIT2

Проблемы заключались в следующем:

  • Функция визуализации сцены не была вызвана в обработчиках WM_SIZE и WM_MOVE.
  • Сцена была нарисована только один раз в секунду.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...