我使用滚动条来显示包含多行的大量数据(一些背景请引用我之前的问题:MFC: how to reduce the time cost of OnInitialUpdate() for scrolling?)。
滚动功能在以下情况下正常工作:(1)单击箭头按钮,(2)单击滚动轴或(3)滚动鼠标滚轮;内容正确向上或向下移动。但是当我拖动滚动拇指时,除非距离非常小,否则它不会真正按预期运行。
当拖动更多一点时,例如向前,它可以向后跳,有时会一直跳到开头。鼠标释放时它永远不会停留,而且我从未成功地将拇指一直拖到最后一条记录。
当我仔细观察时,“GetClipBox(...)”似乎没有返回正确的数据。例如,如果我一直拖到最后,这个函数将返回 rect.top 等于 0。由于我依靠返回值来计算要绘制的记录集,剩下的就乱七八糟了。
可以在此处访问最小的可重现示例:https://138.197.210.223/test/My.tar.gz .测试时,将拇指一直拖到底,效果更佳。
最佳答案
这是由于 16-bit limit of the WM_VSCROLL message .实际上限制是 32767,而不是文档所说的 65535。很久以前在一个项目中遇到过同样的问题。
解决方法是修改WM_VSCROLL
消息处理,以便它使用 GetScrollInfo()
返回的 32 位值函数代替。覆盖 OnVScroll()
(转到类 View ,选择您的 View 并添加 WM_VSCROLL
消息处理程序):
void CMyView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// Workaround the 16-bit limitation
if (nSBCode == SB_THUMBPOSITION || nSBCode == SB_THUMBTRACK)
{
SCROLLINFO si;
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
::GetScrollInfo(m_hWnd, SB_VERT, &si);
// Set nPos to the 32-bit value
nPos = si.nTrackPos;
}
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}
这应该可以解决问题。
关于c++ - MFC:拖动滚动条拇指时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60731384/