2009-07-16 143 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以爲你的應用程序仍然需要上漆。