2012-03-18 156 views
1
 // Main message loop 

     MSG msg; 
     ZeroMemory(&msg, sizeof(msg)); 
     while(msg.message!=WM_QUIT) 
     { 

      if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) 
      { 
       TranslateMessage(&msg); 
       DispatchMessage(&msg); 
      } 
      else 
      { 
       Render(); 
      } 
     } 

的“渲染”功能尚未执行为什么PeekMessage总是返回TRUE?

+0

只有当消息队列中有WM_QUIT时,PeekMessage才会返回FALSE。只有这一点,没有别的。你必须将'Render'功能移到其他地方,这取决于它应该做什么。 – Dialecticus 2012-03-18 16:40:37

+0

@Dialecticus不,它在队列为空时返回'FALSE'。 – 2012-03-18 17:15:30

+0

好吧,很难猜到你从问题中收到了什么信息。当你不调用Begin/EndPaint()的时候,我会反复生成WM_PAINT。 – 2012-03-18 17:41:10

回答

2

PeekMessage文件说,这对于返回值:

如果消息可用,则返回值是非零。

如果没有消息可用,则返回值为零。

当消息队列为空时,它确实会返回零,即FALSE。因此,结论是消息队列永远不会是空的。最有可能的解释是,您在DispatchMessage中处理的一条消息导致相同的消息被发布到队列中。

+0

这在游戏循环中非常标准。 – 2012-03-18 18:29:51

+0

哦,我很粗心。 WndProc有一个空白的案例。 – DeityCallMe 2012-03-19 12:42:28

+1

case WM_PAINT: break;所以在消息队列中总是有一个WM_PAINT – DeityCallMe 2012-03-19 12:44:18