私はCharles Petzoldの "Programming Windows"の例に従っています。この例は、キーボードイベントが発生したときのキーボードメッセージを示しています。自動的にスクロールしてディスプレイを表示します。ここにはコードの一部があります(小さな変更が加えられています)。問題は、通常、キーボードメッセージが受信されると、下部に0が表示されるはずです。別のキーボードメッセージが受信されると、それは1行下にスクロールし、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));
}
ありがとう、ブライアン。したがって、2番目のキーボードメッセージが受信されると、0を示す下側の1行だけが1行上に移動されますが、「覆われていない」領域にはないので0を表示します。 – user565739
正確に。そして、 "覆われた"領域が無効にされているため、 "新しい"行が表示されます。 'WM_PAINT'が無効領域のサイズと位置を考慮せずにすべてを描画すると、' ScrollWindow() 'を使う利点はいくらか減ります... –