2012-07-09 3 views
0

을 종료 할 일으키는 경우 이상한 :문 그래서 나는 다음과 같은 내려고 노력했습니다 타이머를

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

+1

'case IDT_TIMER1 : redraw = true; InvalidateRect (hWnd, NULL, TRUE); case IDT_TIMER2 :'여기에 '휴식'이 없을 것입니다. – chris

답변

2

아무 것도 그리지 않고 (redraw은 false로 가정) DefWindowProc을 호출하지 않아도 매우 정통적입니다. 귀하의 앱은 사용자가 모르게 살아있을 수도 있습니다. doc에서

: WM_PAINT 메시지에 대한 응답으로 BeginPaint 함수와 EndPaint를 호출하거나 창을 검증하기 위해 DefWindowProc를 지나온 기능 에 메시지를 전달해야

응용 프로그램입니다. DefWindowProc는 업데이트 영역의 유효성을 검사합니다. 창 배경을 지울 필요가 있으면 은 WM_ERASEBKGND 메시지를 보낼 수 있습니다.

+0

Directx를 사용하여 렌더링하므로 모든 창 gdi를 제거했습니다. render_frame()은 directx 렌더링의 모든 작업을 수행합니다. –

+0

@JoeyArnoldAndres - 그래,하지만 처음에는'render_frame'을 호출하지 않을거야. –

3

WM_TIMER 메시지는 "우선 순위가 낮음"메시지이며 다른 작업을 수행 할 필요가 없을 때만 생성됩니다. WM_PAINT 핸들러의 문제점은 창을 생성 한 직후에 처음 생성 될 때 페인트하지 않는다는 것입니다. EndPaint()가 호출되지 않아 "윈도우가 더럽다"상태 비트가 켜져 있습니다. 즉시 다른 WM_PAINT 메시지가 생성됩니다. 다시 그리기이 사실이 아니기 때문에 여전히 페인트되지 않습니다. Etcetera, 귀하의 응용 프로그램은 WM_PAINT 메시지에 100 % 코어를 굽히고 WM_TIMER 메시지를 생성 할 수있을 정도로 유휴 상태가되지 않습니다.

다시 그리기 테스트를 제거하여 문제를 해결하십시오. Windows에서 요청할 때 항상 그립니다. 또는 DefWindowProc()에 메시지를 전달하십시오.