2009-07-16 87 views
1

Theres这段代码没有达到第一个else的一些原因? 我从vairous的来源完全一样。比我做了我自己的封装。一切都很好。窗口被创建,消息被处理,事件被生成到客户区的keyborad输入,gl画布工作正常(当我强制绘制时)。Windows消息循环

唯一的问题是,消息循环永远不会离开第一个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; 
+1

很显然,当Translate/Dispatch完成时,它将新消息发布到队列中。您应该列出检索到的所有消息,并推断它是什么消息以及它出现的原因。 – sharptooth 2009-07-16 07:18:13

+0

使用间谍我得到了WM_PAINT硬盘与hdc 0.不知道如何产生。 – 2009-07-16 07:32:43

回答

7

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

  1. 您的代码将新消息发布到队列中,使得队列不会变空。我建议在处理邮件时注销邮件ID。

  2. 您还没有处理绘制消息 - 从MSDN: “的功能的PeekMessage通常不会从队列中删除WM_PAINT消息WM_PAINT消息留在队列中,直到它们被处理,但如果WM_PAINT消息有。 NULL更新区域,PeekMessage会将其从队列中删除。“

希望这会有所帮助。

[编辑] 为了处理WM_PAINT要么调用BeginPaint和EndPaint或转发到DefWindowProc函数

0

可能总会有消息在等待吗?

0

只有消息队列中没有消息,PeekMessage才会返回0。由于有消息要在消息队列中分派,它将返回一个非零值,并且其他条件永远不会执行。

+0

我想他是在问这个 - 为什么不发生没有留下任何信息的事情。 – sharptooth 2009-07-16 07:22:31

4

确保您正确处理WM_PAINT

我的意思是请确保您所呼叫BeginPaint的调用EndPaintWM_PAINT消息里面,否则就会引起混乱的Windows以为你的应用程序仍然需要上漆。