【问题标题】:Window focus issue窗口焦点问题
【发布时间】:2011-11-17 20:51:13
【问题描述】:

我目前正在使用 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);

编辑:我阅读了 Kol 链接的教程并进行了一些编辑,现在即使鼠标不移动,帧速率也是一致的。但是,当我移动或调整窗口大小时,图像仍会冻结,因此我将不胜感激。

【问题讨论】:

    标签: winapi opengl focus window


    【解决方案1】:

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

    编辑

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

    EDIT2

    问题如下:

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

    【讨论】:

    • 我阅读了教程并进行了一些编辑,现在即使鼠标不移动,帧速率也保持一致。但是,当我移动或调整窗口大小时,图像仍会冻结,因此我将不胜感激。我对主要帖子进行了一些编辑以显示我的更改。
    • 嗯...这似乎也无法解决问题。当我移动/调整窗口大小时仍然冻结。
    • 你能编译NeHe的例子吗?运行时不会结冰吗?
    • 我直接从 NeHe 教程构建了代码,当我调整窗口大小时帧速率仍然冻结(我将颜色设置为红色而不是黑色,这样我实际上可以了解帧正在显示)。顺便说一句,冻结是指缓冲区交换暂时停止发生(即 0 FPS),而不是像应用程序崩溃那样。
    猜你喜欢
    • 2011-08-18
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多