OnVScroll 垂直滚动条的默认最小值在最上面 最大值在最下面,滑块在最上面。如何改成最大值在最上面 最小值在最上面 滑块在在下面。改了半天总是不成功 
              ......................................... 
                    ............................... 
        m_nVMaxPos = (int)(m_nMaxGray-m_nYw*m_fVScal); 
m_VScrollCtrl.SetScrollRange(0,m_nVMaxPos); //垂直滚动值范围 
m_VScrollCtrl.SetScrollPos(m_nVScroll); 
............................ 
.............. 
        void CUsbCCDDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 

    int  iMax,iMin; int nVScroll=m_VScrollCtrl.GetScrollPos(); 
m_VScrollCtrl.GetScrollRange(&iMin,&iMax); switch(nSBCode) 

case SB_PAGEUP: 
nVScroll=max(iMin,nVScroll-(iMax-iMin)/4); 
break; 
case SB_PAGEDOWN: 
nVScroll=min(iMax,nVScroll+(iMax-iMin)/4); 
break; 
case SB_LINEDOWN: 
nVScroll=max(nVScroll-1,iMin); 
break; 
case SB_LINEUP: 
nVScroll=min(nVScroll+1,iMax); 
break; 
// case SB_THUMBPOSITION: 
case SB_THUMBPOSITION: 
nVScroll=nPos; 
break; 
    } 
m_VScrollCtrl.SetScrollPos(nVScroll); 
......................... 
......................... 
            设置之后能保证 滚动条的上下小箭头能根据我想的那么移动,(点上+1 点下-1) 但是滑块总是反向运动 (点小箭头向上滑块向下轴,点小箭头向下滑块向上走。托动滑块向下数值越来越大,向上越来越小)如何解决啊。谢谢

解决方案 »

  1.   

    其实你还要设置每页的大小.
    下面是我自己写的控件的滚动代码
    switch (nSBCode)
    {
    case SB_LINEDOWN:
    if (scrollPos < m_nVScrollMax)
    {
    int yScroll =ROWHEIGHT*2;
    SetScrollPos32(SB_VERT, scrollPos + yScroll);
    if (GetScrollPos32(SB_VERT) == scrollPos) break;          // didn't work rect.top =SROLLTOP + yScroll;
    ScrollWindow(0,-yScroll, rect);
    rect.top = rect.top - yScroll;

    //this->SetRedraw(FALSE);
    InvalidateRect(rect);
    //SetRedraw(TRUE);

    }
    break; case SB_LINEUP:
    if (scrollPos > 0)
    {
    int yScroll =ROWHEIGHT*2;
    SetScrollPos32(SB_VERT, max(0,scrollPos - yScroll));
    rect.top =SROLLTOP;
    ScrollWindow(0, yScroll, rect);
    // rect.right = rect.left + xScroll;

    InvalidateRect(rect);

    }
    break; case SB_PAGEDOWN:
    if (scrollPos < m_nVScrollMax)
    {
    rect.top = SROLLTOP;
    int offset = rect.Height();
    int pos = min(m_nVScrollMax, scrollPos + offset);
    //scrollPos=pos;
    SetScrollPos32(SB_VERT, pos);
    rect.top = SROLLTOP;

    InvalidateRect(rect);


    }
    break; case SB_PAGEUP:
    if (scrollPos > 0)
    {
    rect.top = SROLLTOP;
    int offset = -rect.Height();
    int pos = max(0, scrollPos + offset);
    SetScrollPos32(SB_VERT, pos);

    rect.top = SROLLTOP;

    InvalidateRect(rect);

    }
    break; case SB_THUMBPOSITION:
    case SB_THUMBTRACK:
    {
    scrollPos=nPos>0 ? nPos*ROWHEIGHT: GetScrollPos32(SB_VERT, TRUE);
    SetScrollPos32(SB_VERT, scrollPos);
    rect.top = SROLLTOP;

    InvalidateRect(rect);

    }
    break; case SB_TOP:
    if (scrollPos > 0)
    {
    SetScrollPos32(SB_VERT, 0);

    Invalidate();

    }
    break; case SB_BOTTOM:
    if (scrollPos < m_nVScrollMax)
    {
    SetScrollPos32(SB_VERT, m_nVScrollMax);

    Invalidate();

    }
    break;
    default: break;
    }
      

  2.   

    BOOL CMoldGunterDraw::SetScrollPos32(int nBar, int nPos, BOOL bRedraw )
    {
        SCROLLINFO si;
        si.cbSize = sizeof(SCROLLINFO);
        si.fMask  = SIF_POS;
        si.nPos   = nPos;
        return SetScrollInfo(nBar, &si, bRedraw);
    }
    int CMoldGunterDraw::GetScrollPos32(int nBar, BOOL bGetTrackPos )
    {
    SCROLLINFO si;
    si.cbSize = sizeof(SCROLLINFO);
    if (bGetTrackPos)
    {
    if (GetScrollInfo(nBar, &si, SIF_TRACKPOS)) return si.nTrackPos;
    }
    else 
    {
    if (GetScrollInfo(nBar, &si, SIF_POS)) return si.nPos;
    }
    return 0;
    }