Windows消息循环

时间:2009-07-16 07:14:08

标签: c++ winapi opengl

这个代码没有达到第一个的一些原因? 我从vairous来源得到了完全相同的东西。比我做了自己的封装。一切都很顺利。创建窗口,处理消息,生成事件到客户区域中的keyborad输入,gl画布工作正常(当我强制它绘制时)。

唯一的问题是消息循环永远不会离开第一个if。 :/ 我真的被卡住了。

while (!done)                                       
{
    if (::PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
    {
        if (msg.message == WM_QUIT)                 
        {
            done = TRUE;                            
        }
        else                                        
        {
            ::TranslateMessage (&msg);              
            ::DispatchMessage (&msg);               
        }
    }
    else                                        
    {
        // Code is never reaching this!
        draw ();
        ::SwapBuffers(hDC);
        idle ();
    }
}
return msg.wParam;

4 个答案:

答案 0 :(得分:7)

在你的情况下,消息队列绝不能为空 - 为什么?那么这取决于你的程序的其余部分在做什么。一些可能性:

  1. 您的代码正在以一种方式将新消息发布到队列,以使队列不会变空。我建议在处理消息时注销消息ID。

  2. 您没有处理绘制消息 - 来自msdn: “PeekMessage函数通常不会从队列中删除WM_PAINT消息.WM_PAINT消息在处理之前一直保留在队列中。但是,如果WM_PAINT消息具有NULL更新区域,则PeekMessage会将其从队列中删除。”

  3. 希望这有帮助。

    [编辑] 要处理WM_PAINT,请调用BeginPaint和EndPaint或转发到DefWindowProc

答案 1 :(得分:4)

确保正确处理 WM_PAINT

我的意思是确保您从 WM_PAINT 消息中调用 BeginPaint EndPaint ,否则您将会混淆 Windows 认为您的应用程序仍然需要绘制。

答案 2 :(得分:0)

可能总有消息在等待吗?

答案 3 :(得分:0)

只有在消息队列中没有消息时,PeekMessage才会返回0。由于要在消息队列中调度消息,因此它返回非零值,并且永远不会执行您的else条件。