是初学者向你请教写单文档程序时遇到的问题:
环境:XP VC6class CRightView : public CScrollViewvoid CRightView::OnDraw(CDC* pDC)
{
......
CPoint ScrollPos = GetScrollPosition();
DispPositionOnStatusBar(ScrollPos.y);
.......
}
不知为什么,当拖动滾动条时(drag the scroll box (thumb) ),如果拖动的滑块位置超过32xxx时,滑块位置会回0(ScrollPos.y=0),但滑块由于被mouse拖住,并没有回到顶部,松开后立即回到顶部。

解决方案 »

  1.   

    滚动模式设置了吗GetScrollInfo ();//
      

  2.   


    没有。但初始化时已经设置了:
    CSize sizeTotal(0, m_ulStmSize);
    SetScrollSizes(MM_TEXT, sizeTotal);
    只有当ulStmSize>32xxx时,并且拖动的滑块位置也超过32xxx时才会出现这个现象。另请教:GetScrollInfo该设置哪个参数?能给个样例吗?非常感谢。
    我想nPage应该有默认的值,因为当click scroll bar时是正常的一页页的走,可以走到底,滑块并不会回到顶部。也不知问题出在哪?
      

  3.   

    我对CScrollView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)进行了跟踪测试,发现当位置>32xxx时,传进来的位置参数nPos=0xFFFFxxxx,是一个负数,OnVScroll()内部调用的OnScrollBy ()函数中对该值进行了判断,并最终通过SetScrollPos()将位置设置到0。测试步骤是这样的:
    1。用向导生成一个工程名为test的单文档项目
    2。对以下2个函数增加内容:
    void CTestView::OnDraw(CDC* pDC)
    {
    CTestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    LONG y;
    CString strTemp; for (y = 0; y < 40000; y++ ) {
    strTemp.Format("%5.5ld: %s", y, "Test for CScrollView !!!!!");
    pDC->TextOut(0, y * 20, strTemp);
    }
    }void CTestView::OnInitialUpdate()
    {
    CScrollView::OnInitialUpdate(); CSize sizeTotal;
    // TODO: calculate the total size of this view
    sizeTotal.cx = sizeTotal.cy = 40000 * 20;
    SetScrollSizes(MM_TEXT, sizeTotal);
    }
    3。用向导重载OnVScroll()
    void CTestView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    // TODO: Add your message handler code here and/or call default

    CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
    }
    4。在CScrollView::OnVScroll(nSBCode, nPos, pScrollBar)处进行单步断点设置,中断条件为(nPos &0x80000000)>0
     
    5.开始调试。将右边的滾动块往下拖,直至跳出:
     
    6.按“确认”开始调试
     
    (注:nPos=4294942807=0xFFFFA507, 当前滾动块位置不可能是这么大的数字,所以传进来的位置参数就是个错误的数字。在后面的调试中可以看出,程序是把它当作负数处理的。可能这就是bug吧。水平有限,不敢确认,望各位高手指点)
    7.按 进入CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
    8.按 进入OnScroll(MAKEWORD(-1, nSBCode), nPos);
     
    9.按 进入OnScrollBy(CSize(x - xOrig, y - yOrig), bDoScroll)
      
    注意y=-24489,所以if (y < 0)成立,所以y = 0 
    因为y=0,所以SetScrollPos(SB_VERT, y);将使滾动块位置回到0真诚欢迎各位高手指正。
      

  4.   


    请把代码压成*.rar当附件发在我的论坛(http://www.hedanwang.cn/bbs)上.压代码前,请先删除debug,release文件夹,及*.opt,*.ncb,*.plg,*.aps. 
      

  5.   


    CScrollView::OnVScroll(nSBCode, nPos, pScrollBar)是MFC提供的,nPos也是MFC传进来的,也都是UINT的。
      

  6.   

    不知道楼主有没有遇到过这个问题
    在CScrollView类下作出来的打印在别的机器上打印不了
      

  7.   

    阅读了MFC的那部分代码,通过下面代码解决了这个问题,楼主可以试试。
    if((nSBCode == SB_THUMBTRACK || nSBCode == SB_THUMBPOSITION) && ((nPos & 0xffff) > 0x7d00)){
    int yOrig, y;
    yOrig = GetScrollPos(SB_VERT);
    y = nPos;
    ScrollWindow(0, -(y - yOrig));
    SetScrollPos(SB_VERT, nPos & 0xFFFF);
    return;
    }
    CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);