窗口焦点问题

时间:2011-11-17 20:51:13

标签: winapi opengl focus window

我目前正在使用OpenGL和C ++中的Windows API编写图形应用程序。不幸的是,图像在某些条件下冻结,例如当我调整窗口大小时,和/或当我的鼠标不移动时。我可以在Win32中使用某种机制来确保帧不断被处理吗?

这是一些描述我的程序基本流程的伪代码

主循环

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);
编辑:我阅读了链接到的教程并进行了一些编辑,现在即使鼠标不移动,帧速率也是一致的。然而,当我移动或调整窗口大小时,图像仍会冻结,所以我很感激你的帮助。

1 个答案:

答案 0 :(得分:1)

阅读NeHe site以了解使用Win32的OpenGL基础知识。 There详细解释了消息循环应该是什么样子,WM_SIZE处理程序应该做什么等等。

修改

绘制场景和缓冲区交换的代码应该放在消息循环中,在if (PeekMessage(...))分支之后的else分支中。在上面提到的NeHe示例中查看DrawGLScene()电话的位置。

<强> EDIT2

问题如下:

  • 未在WM_SIZE和WM_MOVE处理程序中调用场景渲染器函数。
  • 场景每秒只画一次。