Windows程序设计第四章,在设计滚动条的时候,横竖滚动条都用到了ScrollWindow函数,说是滚动客户区的内容,可是既然滚动了为什么还要用UpdateWindow函数手动触发WM_PAINT消息,并在处理WM_PAINT消息的过程函数中根据滚动条的位置重画客户区的内容。而且,用了ScrollWindow函数后,纵滚动条要调用UpdateWindow函数,而横滚动条却不需要。
这个ScrollWindow函数到底在内部干了什么,起了什么作用?

解决方案 »

  1.   

    横向的也要吧?只是OnPaint处理方法不同导致的
      

  2.   

    Charles Petzold的那本Windows程序设计中横向的没有,还有MSDN中的源码中横向的也没有UpdateWindow函数,纵向的就有,还有WM_PAINT消息的处理函数就一个,这里说的是纯Win32API,不涉及MFC:
    case WM_VSCROLL:
          。
          。
          。
    if (si.nPos != yPos)
             {                    
              ScrollWindow(hwnd, 0, yChar * (yPos - si.nPos), NULL, NULL);
              UpdateWindow (hwnd);
             }
             return 0;

    case WM_HSCROLL:
         。
         。
         。
    if (si.nPos != xPos)
             {
              ScrollWindow(hwnd, xChar * (xPos - si.nPos), 0, NULL, NULL);
             }
             return 0;这是WndProc中的WM_PAINT消息的处理:
    case WM_PAINT :
             // Prepare the window for painting
             hdc = BeginPaint (hwnd, &ps);         // Get vertical scroll bar position
             si.cbSize = sizeof (si);
             si.fMask  = SIF_POS;
             GetScrollInfo (hwnd, SB_VERT, &si);
             yPos = si.nPos;         // Get horizontal scroll bar position
             GetScrollInfo (hwnd, SB_HORZ, &si);
             xPos = si.nPos;         // Find painting limits
             FirstLine = max (0, yPos + ps.rcPaint.top / yChar);
             LastLine = min (LINES - 1, yPos + ps.rcPaint.bottom / yChar);
             
             for (i = FirstLine; i <= LastLine; i++)
             {
                  x = xChar * (1 - xPos);
                  y = yChar * (i - yPos);
                  
                  TextOut (hdc, x, y, abc[i], lstrlen(abc[i]));
             }         // Indicate that painting is finished
             EndPaint (hwnd, &ps);
             return 0;