CharlesPetzoldの著書「ProgrammingWindows」の例に従いました。この例は、キーボードイベントが発生したときのキーボードメッセージを示しています。自動的にスクロールして表示します。これがコードの一部です(若干の変更があります)。問題は次のとおりです。通常、キーボードメッセージを受信すると、下部に0が表示されます。別のキーボードメッセージを受信すると、1行下にスクロールし、下部に0が表示され、下部に1が表示されます。しかし、私が持っているのは、常に0が表示されることです。ウィンドウのサイズを変更した場合にのみ、正しい結果は次のようになります。....4、3、2、1、0。問題は、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));
}