如何获得可以移动滑块的最大速率(频率)?

Posted

技术标签:

【中文标题】如何获得可以移动滑块的最大速率(频率)?【英文标题】:How to get the maximum rate (frequency) at which a slider can be moved? 【发布时间】:2015-12-11 14:06:01 【问题描述】:

我想确定在基于 MFC 的 Visual C++ 程序(使用 Visual Studio 2012)中可以移动滑块的速率(频率)。那么如何以编程方式获得合适的轮询率呢?

这是我用于捕获滑块值的代码:

void CMainDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
// catches slider horizontal scrolling events

    double val;
    ScopeGuardMutex guard(&m_mutex);
    val = (double)(((CSliderCtrl *)pScrollBar)->GetPos()) / (double)SLD_MAX;
    rec->param = val;
    CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

如果无法以编程方式确定此值,则是否存在近似值,例如100赫兹?

【问题讨论】:

包含更多关于您尝试展示问题研究的信息可能会有所帮助。代码 sn-ps 总是一个加号。 这个问题是由于误解导致设计不当的结果。您可以更新滑块的速度完全取决于您的程序调用GetMessage 的速度(详见Paint messages will come in as fast as you let them)。解决方案:不要轮询。让滑块在需要更新时通知您的应用程序。 Windows GUI 是基于事件的。轮询通常在这里是错误的。 消息到达的速度不会比您的应用程序调用GetMessage 快。正如上面的链接所解释的,此限制不是滑块控件的功能。为什么你需要知道最大值。频率?你打算如何处理这些信息? 我想取滑块的值并限制它的斜率,避免突然变化! 为什么你需要知道最大值。那么提前改变汇率呢?你不能处理观察到的信息吗?您可以通过调用GetMessageTime查询当前消息的时间戳 【参考方案1】:

无需轮询滑块。 Windows GUI 在设计上是基于事件的。

只需按照滑块通知消息中的说明处理 OnHScroll()OnVScroll() 消息。当用户移动滑块并释放鼠标按钮时,将发送TB_THUMBPOSITION 通知(滚动处理程序的nSBCode 参数)。位置在nPos 参数中传递,并在pScrollBar 参数中传递一个指向滑块控件的指针(这必须转换为CSliderCtrl*)。

像这样添加WM_HSCROLL 处理程序:

void CMyDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

    if (IDC_SLIDER == pScrollBar->GetDlgCtrlID())
    
        // When there is no member variable and we need to access the control
        CSliderCtrl* pSlider = reinterpret_cast<CSliderCtrl*>(pScrollBar);
        // Handle event here
        switch (nSBCode)
        
            case TB_LINEUP:
            case TB_LINEDOWN:
            case TB_PAGEUP:
            case TB_PAGEDOWN:
            case TB_THUMBPOSITION:
            case TB_TOP:
            case TB_BOTTOM:
            case TB_THUMBTRACK:
            case TB_ENDTRACK:
            default:
                break;
        
        return;
    
    // Default handling if not a slider control.
    CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

【讨论】:

我已经在我的程序中使用了 OnHScroll。我想知道这些消息到达的系统的速率(以赫兹为单位)。 消息泵的处理速度取决于很多因素。阅读 IInspectable 建议的 MSDN 文章以了解更多信息。【参考方案2】:

我意识到我没有以正确的方式解决这个问题。滑块值改变的速率并不重要,重要的是滑块值被跟随的速率。这两个费率是独立的。假设被滑块控制的参数在 0 到 1 的范围内,滑块值跟随的速率 (r) 和允许值改变的最大频率 (f) 是应该在摆率限制器计算最大步长(s),如下:

s = 2 * f / r

【讨论】:

以上是关于如何获得可以移动滑块的最大速率(频率)?的主要内容,如果未能解决你的问题,请参考以下文章

如何垂直移动带有滑块的UILabel

如何在 HTML 中移动优化我的滑块的大小?

如何动态更改 jquery ui 滑块的最小值、最大值?

如何让滑块的拇指一直移动到最后?

滑块移动时删除注释 - 迅速

是否可以根据其他表单的输入来更改 HTML5 范围滑块的最小值和最大值?