c++ - MFC:拖动滚动条拇指时的奇怪行为

标签 c++ visual-studio visual-c++ mfc

我使用滚动条来显示包含多行的大量数据(一些背景请引用我之前的问题: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/

相关文章:

c++ - 为什么有或没有 const 修饰符会使效率相差 4 倍?

c++ - 优化是否会影响使用其 PDB 调试 VC++ 应用程序的能力?

visual-studio - 广泛安装 Nuget 包解决方案

c++ - 下载文件,winsock recv() 写入 fstream,文件损坏

c++ - 节流 C++ 线程

c++ - 如何在 __asm 中使用变量?

c++ - 如何防止将空指针转换为引用

c++ - 如何为我的应用程序的 DLL 创建一个单独的文件夹?

c++ - 从另一个方法调用 map 上的方法

visual-studio - Monitor.Exit() 上的 SynchronizationLockException?