【发布时间】:2016-07-07 09:08:49
【问题描述】:
我在 CScrollView 中滚动大面积区域时遇到问题。当从上到下缓慢移动滚动条时,行为如下:起初滚动工作正常。在某些时候,进一步滚动不会做任何事情,而是显示该区域的顶部。在某些时候,滚动会再次从顶部开始。
这是一个小例子。我使用文档视图模型创建了一个新的 MFC 项目,并使用 CScrollView 作为视图类。我添加了以下代码来创建一个大区域并添加一些文本来显示,当前显示的是哪个部分:
void CScrollViewTest2View::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100*1000;
SetScrollSizes(MM_TEXT, sizeTotal);
for(int i = 0; i < 1000; i++)
{
CStatic* label = new CStatic();
label->Create(NULL, WS_CHILD | WS_VISIBLE, CRect(10,10 + i*100,100,30 + i*100), this);
CString text;
text.Format(L"%d",i);
label->SetWindowText(text);
}
}
如果我添加以下代码,我会看到在滚动过程中“nPos”值似乎环绕。这可以解释这种行为。但我不知道如何解决这个问题。
BOOL CScrollViewTest2View::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll )
{
CString msg;
msg.Format(L"nPos = %u\n",nPos);
TRACE(msg);
return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll);
}
这是停止滚动时的输出:
nPos = 27826
nPos = 29190
nPos = 30281
nPos = 31372
nPos = 31645
nPos = 32464
nPos = 4294938588
nPos = 4294939134
nPos = 4294939407
nPos = 4294939680
nPos = 4294940225
nPos = 4294940771
那么有没有办法使用 CScrollView 完全向下滚动一大片区域呢?
示例项目的代码可以在here找到。
【问题讨论】:
-
CScrollView使用SetScrollRange和其他有 16 位限制的旧函数,它只能上升到32767。它应该使用SetScrollInfo/GetScrollInfo,但他们懒得更新。您在创建坐标超出 16 位范围的静态控件时还有一个问题,我认为没有解决方案。 -
所以如果我使用'SetScrollInfo/GetScrollInfo' 编写我自己的'CScrollView' 版本,我会解决这个问题吗?你知道是否有人已经这样做并提供了它吗?静态控制和坐标超出 16 位范围究竟有什么问题?感谢您的帮助。
-
我认为无法将窗口控件放置在 32767 范围之外。我为
CScrollView添加了一个修复程序,它用于常规绘图,否则您可能需要考虑 HTML 对话框或其他解决方案。
标签: c++ windows mfc ccscrollview