2012-07-09 44 views
0

所以我一直在試圖找出以下幾點:怪異的if語句導致關閉計時器

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    HDC hDC;    // Display context handle 
    PAINTSTRUCT PaintSt; // Structure defining area to be drawn 
    RECT aRect;    // A working rectangle 
    HPEN hPen;    // A working pen 
    HBRUSH hBrush;   // A working brush 
    switch(message) 
    { 
     case WM_TIMER: 
      switch(wParam) 
      { 
      case IDT_TIMER1: 
        redraw = true; 
       InvalidateRect(hWnd, NULL, TRUE); 
      case IDT_TIMER2: 
       if(keys[UP]) 
      { 
       rect2.bottom -= 5; 
       rect2.top -= 5; 
      } 
      if(keys[DOWN]) 
      { 
       rect2.bottom += 5; 
       rect2.top += 5; 
      } 
      if(keys[RIGHT]) 
      { 
       rect2.left += 5; 
       rect2.right += 5; 
      } 
      if(keys[LEFT]) 
      { 
       rect2.left -= 5; 
       rect2.right -= 5; 
      } 
     } 
     return 0; 
    case WM_PAINT: 
      //if(redraw) 
      { 
       redraw = false; 
       render_frame(); 
      } 
     return 0; 

    case WM_KEYDOWN: 

      switch(wParam) 
      { 
      case VK_UP: 
       keys[UP] = true; 
       break; 
      case VK_DOWN: 
       keys[DOWN] = true; 
       break; 
      case VK_LEFT: 
       keys[LEFT] = true; 
       break; 
      case VK_RIGHT: 
       keys[RIGHT] = true; 
       break; 
      default: 
       break; 
      } 

     return 0; 
    case WM_KEYUP: 
     switch(wParam) 
     { 
     case VK_UP: 
      keys[UP] = false; 
      break; 
     case VK_DOWN: 
      keys[DOWN] = false; 
      break; 
     case VK_LEFT: 
      keys[LEFT] = false; 
      break; 
     case VK_RIGHT: 
      keys[RIGHT] = false; 
      break; 
     default: 
       break; 
     } 
     return 0; 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     return 0; 

    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); // default message processing 
    } 
} 

所以這裏的問題:在情況下WM_PAINT:,當我去掉if語句,時間由於某種原因停止滴答。我不知道爲什麼,也不知道如何將這與任何事物聯繫起來。所以,如果我取消註釋它,它不會呈現,也不會從另一個定時器(有兩個定時器)接收信息。請幫助我,如果它很傻,請不要笑。

+0

難道'render_frame'會再次調用'WindowProc'嗎?那麼你會有一個很好的,無限的功能。 – qdii 2012-07-09 22:14:05

+1

'case IDT_TIMER1: redraw = true; InvalidateRect(hWnd,NULL,TRUE); case IDT_TIMER2:'你可能在這裏錯過了一個'break'。 – chris 2012-07-09 22:17:44

回答

2

處理WM_PAINT沒有畫任何東西(假設redraw保持false),甚至沒有呼籲DefWindowProc是非常非傳統的。你的應用程序甚至可能還活着,沒有你注意。

doc

應用程序必須調用BeginPaint和EndPaint響應於 WM_PAINT消息,或消息傳遞給DefWindowProc函數 驗證窗口。 DefWindowProc驗證更新區域;如果窗口背景需要刪除 ,則它可以發送WM_ERASEBKGND消息。

+0

我正在使用Directx來渲染,所以我刪除了所有的窗口gdi。 render_frame()包含directx渲染的所有操作。 – 2012-07-09 22:26:53

+0

@JoeyArnoldAndres - 是的,但你絕不會第一次調用render_frame。 – 2012-07-09 22:44:10

3

WM_TIMER消息是一個「低優先級」消息,它只在沒有其他需要完成時纔會生成。 WM_PAINT處理程序的問題在於,它在創建窗口後立即不會第一次生成它。 EndPaint()不會被調用,導致「窗口髒」狀態位打開。這立即導致生成另一個WM_PAINT消息。哪個仍然不會畫,因爲重繪不正確。 Etcetera,你的應用程序正在對WM_PAINT消息進行100%的核心刻錄,並且永遠不會有足夠的空閒以允許生成WM_TIMER消息。

只需刪除重繪測試來解決您的問題。當Windows要求時總是畫圖。或者將消息傳遞給DefWindowProc()。