MFC的CSrollView在大尺寸下,拖动滚动条会回弹,求解决。

CSrollView在大尺寸下,拖动滚动条会回弹。我在OnVScroll打印了信息,如下:voidCCodesView::OnVScroll(UINTnSBCode,UI... CSrollView在大尺寸下,拖动滚动条会回弹。我在OnVScroll打印了信息,如下:
void CCodesView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
Invalidate();
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
CSize total_size = GetTotalSize();
int scroll_pos = GetScrollPos(SB_VERT);
CPoint scroll_pt = GetScrollPosition(); // 左上点的坐标
TRACE("total_size:%d,%d, scroll_pos:%d, scroll_pt:%d,%d, nPos:%d\n",total_size.cx,total_size.cy,scroll_pos,scroll_pt.x,scroll_pt.y,nPos);
}
TRACE的部分信息为:
total_size:1827,1270699, scroll_pos:10951, scroll_pt:0,10951, nPos:10951
total_size:1827,1270699, scroll_pos:14490, scroll_pt:0,14490, nPos:14490
total_size:1827,1270699, scroll_pos:18028, scroll_pt:0,18028, nPos:18028
total_size:1827,1270699, scroll_pos:18028, scroll_pt:0,18028, nPos:18028

总高度是1270699,但滚动点最多只到了18028,相差甚远,但是我明明已经把滚动条拉到最后了。这个view的page和line size比较小,会不会和这个相关?怎么解决这个问题?
补充一点,这个view的绘图用的是双缓存方法,是否和这个有关?
展开
 我来答
bhtzu
推荐于2016-05-18 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8088
采纳率:85%
帮助的人:4212万
展开全部

两个问题:

  1. 总高度是1270699是必然失败的,这个高度严重超出了View类位图绘制的限制范围,太大了。

  2. OnVScroll里面,不应该上来就Invalidate,这个严重消耗资源,系统在滚动消息之后会自动触发区域重绘,你这个全部重绘对于一个超大视图来说,消耗太大了。

CView显示位图,理论最大范围是64k*64k,也就是说总的位大小不能超过4G位,但实际上,当高度或者宽度超高的时候,也会出错。

你这个情况,如果高度确定是127万,那么必须用算法优化进行局部显示和切换,不可能全部显示到一个视图中的。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式