【问题标题】:MFC: strange behavior when dragging scrollbar thumbMFC:拖动滚动条拇指时的奇怪行为
【发布时间】:2020-06-29 01:34:26
【问题描述】:

我使用滚动条来显示一大段多行数据(一些背景请参考我之前的问题:MFC: how to reduce the time cost of OnInitialUpdate() for scrolling?)。

滚动功能在以下情况下正常工作:(1)单击箭头按钮,(2)单击滚动轴或(3)滚动鼠标滚轮;内容正确地向上或向下移动。但是,当我拖动滚动拇指时,除非距离非常小,否则它的行为并不像预期的那样。

当拖得更多时,例如向前,它可能会向后跳,有时会一直跳到起点。释放鼠标时它永远不会停留,我也从未成功地将拇指拖到最后一条记录。

当我仔细观察时,“GetClipBox(...)”似乎没有返回正确的数据。例如,如果我一直拖到最后,此函数将返回 rect.top 等于零。由于我是靠返回值来计算要绘制的记录集,剩下的就乱套了。

可以在此处访问最小的可重现示例:https://138.197.210.223/test/My.tar.gz。测试时,将拇指一直拖到最后,效果会更好。

【问题讨论】:

  • 请显示minimal reproducible example。听起来一切都按预期进行,但是您的计算是错误的。在计算滚动范围时很容易引入一个错误。
  • @IInspectable,请在此处访问 mre 138.197.210.223/test/My.tar.gz。测试时,将大拇指一直拖到最后,效果会更好。另外,我必须使用 VS-2008。感谢您的帮助。

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


【解决方案1】:

您是否添加了WM_HSCROLLWM_VSCROLL消息?

当滚动事件发生时,WM_HSCROLL 消息被发送到窗口 在窗口的标准水平滚动条中。这个消息也是 滚动时发送给水平滚动条控件的所有者 事件发生在控件中。

当滚动事件发生时,WM_VSCROLL 消息被发送到窗口 在窗口的标准垂直滚动条中。这个消息也是 滚动事件时发送给垂直滚动条控件的所有者 发生在控件中。

我建议您可以尝试在 OnHScroll 函数或 OnVScroll 函数中添加以下代码:

case SB_THUMBPOSITION:
    pScrollBar->SetScrollPos(nPos);
    break;

【讨论】:

  • 感谢您的帮助。我尝试通过执行void CMyView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { pScrollBar->SetScrollPos(nPos); } 来遵循您的建议,这不适用于内存访问冲突,因为 pScrollBar 为 NULL(不知道为什么)。
  • 能否请您出示minimal reproducible example。我无法打开您提供的链接。如果您能向我们提供重现问题的具体步骤,我们将不胜感激,我们将为您提供更好的帮助。
  • 您应该能够从该链接下载。如果浏览器抱怨安全性,请继续。我为 https 使用自签名证书。
【解决方案2】:

这是由于16-bit limit of the WM_VSCROLL message。实际上限制是 32767,而不是文档所说的 65535。很久以前在一个项目中遇到过同样的问题。

解决方法是修改WM_VSCROLL 消息处理,使其改用GetScrollInfo() 函数返回的32 位值。覆盖OnVScroll()(转到类视图,选择您的视图并添加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);
}

这应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多