这个代码没有达到第一个的一些原因? 我从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;
答案 0 :(得分:7)
在你的情况下,消息队列绝不能为空 - 为什么?那么这取决于你的程序的其余部分在做什么。一些可能性:
您的代码正在以一种方式将新消息发布到队列,以使队列不会变空。我建议在处理消息时注销消息ID。
您没有处理绘制消息 - 来自msdn: “PeekMessage函数通常不会从队列中删除WM_PAINT消息.WM_PAINT消息在处理之前一直保留在队列中。但是,如果WM_PAINT消息具有NULL更新区域,则PeekMessage会将其从队列中删除。”
希望这有帮助。
[编辑] 要处理WM_PAINT,请调用BeginPaint和EndPaint或转发到DefWindowProc
答案 1 :(得分:4)
确保正确处理 WM_PAINT 。
我的意思是确保您从 WM_PAINT 消息中调用 BeginPaint 和 EndPaint ,否则您将会混淆 Windows 认为您的应用程序仍然需要绘制。
答案 2 :(得分:0)
可能总有消息在等待吗?
答案 3 :(得分:0)
只有在消息队列中没有消息时,PeekMessage才会返回0。由于要在消息队列中调度消息,因此它返回非零值,并且永远不会执行您的else条件。