2012-03-18 155 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