【提问】刚开始学win32编程,关于滚动条的有一段代码搞不懂解决方案

【提问】刚开始学win32编程,关于滚动条的有一段代码搞不懂
下面这段代码是处理滚动条消息的(windows程序那本书上面的)。
我想问SetScrollInfo()是直接使用SCROLLINFO结构中的信息来控制滚动条的位置和外观吗?
是不是调用它以后,滚动条就会改变?
还有,倒数第六行的GetScrollInfo()是不是多余的,好像不调用它也行?
case WM_VSCROLL:
            //Get all the vertical scroll bar information
        si.cbSize  = sizeof(si);
        si.fMask   = SIF_ALL;
        GetScrollInfo(hwnd, SB_VERT, &si);
            //Save the position for comparison later on
        iVertPos = si.nPos;
        switch(LOWORD(wParam))
        {
        case SB_TOP:
            si.nPos = si.nMin;
            break;
        case SB_BOTTOM:
            si.nPos = si.nMax;
            break;
        case SB_LINEUP:
            si.nPos -= 1;
            break;
        case SB_LINEDOWN:
            si.nPos += 1;
            break;
        case SB_PAGEUP:
            si.nPos -= si.nPage;
            break;
        case SB_PAGEDOWN:
            si.nPos += si.nPage;
            break;
        case SB_THUMBTRACK:
            si.nPos = si.nTrackPos;
            break;
        default :
            break;
        }
        si.fMask = SIF_POS;
        SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
        GetScrollInfo(hwnd, SB_VERT, &si);
        if(si.nPos != iVertPos)
        {
            ScrollWindow(hwnd, 0, cyChar * (iVertPos - si.nPos), NULL, NULL);
        }
        return 0;

------解决思路----------------------
The SetScrollInfo function performs range checking on the values specified by the nPage and nPos members of the SCROLLINFO structure. The nPage member must specify a value from 0 to nMax - nMin +1. The nPos member must specify a value between nMin and nMax - max(nPage – 1, 0). If either value is beyond its range, the function sets it to a value that is just within the range. 
也就是说SetScrollInfo后,设置的参数和内部生效的参数可能会有差别,再使用GetScrollInfo可以得到真正生效的参数
------解决思路----------------------
1、是的。
2、LS说得对,你说得也对,去掉也不错,其实就是为了提高代码效率,如果现在滚动条已经在最上面了,你用鼠标点击向上,如果用-=1会得出越界的位置,而SetScrollInfo会自动修正这个位置,你可以这么试验一下,把if那句注释掉,在ScrollWindow这个函数处F9设置断点,运行程序后用鼠标点击向上的滚动标志,此时程序会中断在ScrollWindows处,而你加上了if判断,就不会中断,其实就是避免了不必要的重绘。