2012-05-12 3 views
0

Charles Petzold의 "Programming Windows"의 예제를 따랐습니다. 이 예제는 키보드 이벤트가 발생할 때 키보드 메시지를 표시합니다. 자동으로 화면을 스크롤하여 표시합니다. 다음은 코드의 일부입니다 (약간 수정). 문제는 다음과 같습니다. 일반적으로 키보드 메시지를 받으면 맨 아래에 0이 표시됩니다. 다른 키보드 메시지를 받으면 줄을 따라 아래로 스크롤하고 아래쪽에 0을 표시하고 아래쪽에 1을 표시합니다. 하지만 항상 0으로 표시됩니다. 창 크기를 조정할 때만 .... 4, 3, 2, 1, 0과 같은 올바른 결과를 얻으십시오. 문제는 ScrollWindow를 호출 할 때 무언가가 다시 그려지지 않는다는 것입니다. 그러나 정확하게 문제가 무엇인지 모릅니다. 도서.ScrollWindow가 일부 영역을 다시 칠하지 않음

case WM_SIZE: 

     if (message == WM_SIZE) 
     { cxClient = LOWORD (lParam); 
      cyClient = HIWORD (lParam); 
     } 

     // Calculate scrolling rectangle 

     rectScroll.left = 0; 
     rectScroll.right = cxClient; 
     rectScroll.top = cyChar; 
     rectScroll.bottom = cyChar * (cyClient/cyChar); 

     InvalidateRect(hwnd, NULL, TRUE); 

     return 0; 

    case WM_KEYDOWN: 
    case WM_KEYUP: 
    case WM_CHAR: 
    case WM_DEADCHAR: 
    case WM_SYSKEYDOWN: 
    case WM_SYSKEYUP: 
    case WM_SYSCHAR: 
    case WM_SYSDEADCHAR: 

     for (i = cLinesMax - 1; i > 0 ; i--) 
     { 
      pmsg[i] = pmsg[i - 1]; 
     } 

     // Store new message 

     pmsg[0].hwnd = hwnd; 
     pmsg[0].message = message; 
     pmsg[0].wParam = wParam; 
     pmsg[0].lParam = lParam; 

     cLines = min(cLines + 1, cLinesMax); 

     // Scroll up the display 

     ScrollWindow(hwnd, 0, -cyChar, &rectScroll, &rectScroll); 

     break; // call DefWindowProc so System messages work 

    case WM_PAINT: 

     hdc = BeginPaint(hwnd, &ps); 

     for (i = 0; i < min(cLines, cyClient/cyChar - 1); i++) 
     { 
      TextOut(hdc, 0, (cyClient/cyChar - 1 - i) * cyChar, szBuffer, 
        wsprintf(szBuffer, TEXT("%5d"), i)); 

     } 

답변

3

ScrollWindow()의 요점은 모든 것을 다시 칠 필요없이 창 의 기존 내용을 이동하는 것입니다. 기본적인 가정은 스크롤되는 작업의 결과로 이동되는 내용이 변경되지 않으며 "덮개가없는"영역 만 칠해 야한다는 것입니다. 당신의 예에서

당신은, 변화 (라인을 넘버링에 의해) 내용뿐만 아니라 이동을합니다. 즉, 다시 그려야 함을 의미합니다. 핵심 메시지 처리의 ScrollWindow()은 발생하지 않지만 WM_SIZE 처리기의 InvalidateRect()은 처리합니다.

+0

감사합니다. 브라이언. 따라서 두 번째 키보드 메시지가 수신되면 아래쪽의 0 행을 나타내는 유일한 행은 "발견되지 않은"영역에 있지 않으므로 0을 표시합니다. 따라서 다시 그려지지 않습니다. – user565739

+1

정확하게. 그리고 "새"라인은 "발견되지 않은"영역이 무효화되어 나타나기 때문에 페인트됩니다. 'WM_PAINT'가 무효 영역의 크기와 위치를 고려하지 않고 모든 것을 그릴 때'ScrollWindow() '사용의 이점은 다소 줄어 듭니다. –

관련 문제