2012-05-12 22 views
0

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

     } 

答えて

3

ScrollWindow()の全体のポイントははすべてを再描画することなく、ウィンドウの既存の内容を移動することです。基本的な前提は、移動されるコンテンツはスクロールアクションの結果として変化せず、「覆われていない」領域のみがペイントされる必要があるということです。あなたの例では

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

+0

ありがとう、ブライアン。したがって、2番目のキーボードメッセージが受信されると、0を示す下側の1行だけが1行上に移動されますが、「覆われていない」領域にはないので0を表示します。 – user565739

+1

正確に。そして、 "覆われた"領域が無効にされているため、 "新しい"行が表示されます。 'WM_PAINT'が無効領域のサイズと位置を考慮せずにすべてを描画すると、' ScrollWindow() 'を使う利点はいくらか減ります... –

関連する問題