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));
}
감사합니다. 브라이언. 따라서 두 번째 키보드 메시지가 수신되면 아래쪽의 0 행을 나타내는 유일한 행은 "발견되지 않은"영역에 있지 않으므로 0을 표시합니다. 따라서 다시 그려지지 않습니다. – user565739
정확하게. 그리고 "새"라인은 "발견되지 않은"영역이 무효화되어 나타나기 때문에 페인트됩니다. 'WM_PAINT'가 무효 영역의 크기와 위치를 고려하지 않고 모든 것을 그릴 때'ScrollWindow() '사용의 이점은 다소 줄어 듭니다. –