程序是别人编的。
初始化后显示第一页,如果此时向下滚动一行,屏幕会滚动两行
如果继续滚动屏幕,屏幕会滚动一行。
如果向上滚动屏幕也是第一次滚动两行,而后面每次滚动一行。
谁知道是怎么回事?

解决方案 »

  1.   

    你是用什么滚动的?
    鼠标中键?
    pagedown,pageup?
    方向键?
    space?说清楚三
      

  2.   

    或许你一开始动的地方,恰恰是不足一个字符高吧!
    -----------------------------------------------这种说法也很有道理,是一个可以复现的又合理的Bug.
      

  3.   

    void CGenericSheet::OnVScroll(
       UINT nSBCode,
       UINT nPos,
       CScrollBar* pScrollBar 
    )
    {
    // TODO: Add your message handler code here and/or call default
    if(m_IsUseVScroll == FALSE)
    goto PrarentVScroll; long nWidth,nHeight;
    GetClientArea(&nWidth,&nHeight);
    SetUnitType(2);
    nWidth = nHeight / this->GetRowHeight(1) - 1;
    SetUnitType(0); SCROLLINFO scrollinfo;
    GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
    switch (nSBCode)
    {
    case SB_BOTTOM:
    //ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax));
    scrollinfo.nPos = scrollinfo.nMax - scrollinfo.nPage;
    ViewTable(scrollinfo.nPos ,scrollinfo.nMax);
    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
    break;
    case SB_TOP:
    //ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin));
    scrollinfo.nPos = scrollinfo.nMin;
    ViewTable(scrollinfo.nPos,nWidth);
    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
    break;
    case SB_LINEUP:
    scrollinfo.nPos -= 1;
    if (scrollinfo.nPos<scrollinfo.nMin)
    {
    scrollinfo.nPos = scrollinfo.nMin;
    break;
    }
    ViewTable(scrollinfo.nPos,nWidth);
    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
    break;
    case SB_LINEDOWN:
    scrollinfo.nPos += 1;
    if (scrollinfo.nPos>scrollinfo.nMax)
    {
    scrollinfo.nPos = scrollinfo.nMax - scrollinfo.nPage;
    break;
    }
    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
    ViewTable(scrollinfo.nPos ,nWidth); //ScrollWindow(0,-1);
    break;
    case SB_PAGEUP:
    scrollinfo.nPos -= scrollinfo.nPage;
    if (scrollinfo.nPos<scrollinfo.nMin)
    {
    scrollinfo.nPos = scrollinfo.nMin;
    break;
    }
    ViewTable(scrollinfo.nPos ,nWidth);
    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
    //ScrollWindow(0,10*5);
    break;
    case SB_PAGEDOWN:
    scrollinfo.nPos += scrollinfo.nPage;
    if (scrollinfo.nPos>scrollinfo.nMax)
    {
    scrollinfo.nPos = scrollinfo.nMax - scrollinfo.nPage;
    break;
    }
    ViewTable(scrollinfo.nPos ,nWidth);
    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
    //ScrollWindow(0,-1*5);
    break;
    case SB_ENDSCROLL:
    // MessageBox("SB_ENDSCROLL");
    break;
    case SB_THUMBPOSITION:
    // ScrollWindow(0,(scrollinfo.nPos-nPos)*10);
    // scrollinfo.nPos = nPos;
    // SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
    break;
    case SB_THUMBTRACK:
    //ScrollWindow(0,(scrollinfo.nPos-nPos)/*10*/);
    scrollinfo.nPos = nPos;
    ViewTable(scrollinfo.nPos ,nWidth);
    SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
    break;
    }
    PrarentVScroll:
    CSpreadSheet::OnVScroll(nSBCode,nPos,pScrollBar);
    }
    就是这一段代码实现了滚动
      

  4.   

    BOOL CGenericSheet::ViewTable(long nStart,long count )
    {
    CString strField;
    long row = 1,
    RowHeight = GetRowHeight(row);
    ClearnAllCell(); m_set.SetAbsolutePosition(nStart); int rows;
    while(row < count && !m_set.IsEOF( ) )
    {
    for(int i =0;i<m_set.GetODBCFieldCount();i++)
    {
    m_set.GetFieldValue(i,strField);
    SetCellContect(i,row,strField);
    }
    SetRowHeight(row,RowHeight);
    m_set.MoveNext();
    row++;
    rows = GetMaxRows();
    if(row > GetMaxRows() && row < count)
    {
    SetMaxRows(row);
    this->SetRowHeight(row,RowHeight);
    }
    }

    return TRUE;
    }
    这段实现了显示页面的工作