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

'PeekMessage' вернет FALSE только в том случае, если в очереди сообщений WM_QUIT. Только это и ничего больше. Вы должны перемещать функцию «Render» где-то в другом месте, что зависит от того, что она должна делать. – Dialecticus

+0

@Dialecticus Нет, он возвращает 'FALSE', когда очередь пуста. –

+0

Ну, трудно догадаться, какое сообщение вы получаете от вопроса. Я положу доллар на WM_PAINT, сгенерированный снова и снова, когда вы не вызываете Begin/EndPaint(). –

ответ

2

документация PeekMessage говорит, что это относительно возвращаемого значения:

Если сообщение доступно, возвращаемое значение равно нулю.

Если сообщений нет, возвращаемое значение равно нулю.

Когда очередь сообщений пуста, она действительно вернет нуль, то есть FALSE. Поэтому вывод состоит в том, что очередь сообщений никогда не бывает пустой. И наиболее вероятным объяснением этого является то, что одно из сообщений, которые вы обрабатываете в DispatchMessage, ведет к тому же сообщению, которое отправляется в очередь.

+0

Это довольно стандартный в игровом цикле. –

+0

О, я так небрежен. У WndProc есть пустой случай. – DeityCallMe

+1

case WM_PAINT: break; поэтому всегда есть очередь WM_PAINT в очереди сообщений – DeityCallMe

Смежные вопросы