Windows消息循环

Rub*_*oso 1 c++ opengl winapi

这个代码有没有达到第一个的原因?我从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;
Run Code Online (Sandbox Code Playgroud)

mor*_*lli 7

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

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

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

希望这可以帮助.

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