是初学者向你请教写单文档程序时遇到的问题:
环境: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拖住,并没有回到顶部,松开后立即回到顶部。
环境: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拖住,并没有回到顶部,松开后立即回到顶部。
没有。但初始化时已经设置了:
CSize sizeTotal(0, m_ulStmSize);
SetScrollSizes(MM_TEXT, sizeTotal);
只有当ulStmSize>32xxx时,并且拖动的滑块位置也超过32xxx时才会出现这个现象。另请教:GetScrollInfo该设置哪个参数?能给个样例吗?非常感谢。
我想nPage应该有默认的值,因为当click scroll bar时是正常的一页页的走,可以走到底,滑块并不会回到顶部。也不知问题出在哪?
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真诚欢迎各位高手指正。
请把代码压成*.rar当附件发在我的论坛(http://www.hedanwang.cn/bbs)上.压代码前,请先删除debug,release文件夹,及*.opt,*.ncb,*.plg,*.aps.
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar)是MFC提供的,nPos也是MFC传进来的,也都是UINT的。
在CScrollView类下作出来的打印在别的机器上打印不了
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);