0

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));

        }
4

1 に答える 1

3

の要点は、すべてを再描画する必要なくScrollWindow()、ウィンドウの既存のコンテンツを移動することです。基本的な仮定は、スクロール アクションの結果として移動されるコンテンツは変更されず、「カバーされていない」領域のみをペイントする必要があるということです。

あなたの例では、コンテンツを移動するだけでなく、(行の番号を付け直すことによって) コンテンツを変更したいと考えています。つまり、再描画する必要があります。これは、主要なメッセージ処理では発生しませんが、ハンドラーでは発生します。ScrollWindow()InvalidateRect()WM_SIZE

于 2012-05-12T21:57:45.220 に答える