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

How to get the maximum rate (frequency) at which a slider can be moved?

本文关键字:速率 频率 移动 何获得      更新时间:2023-10-16

我想确定在基于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);
}

如果该值无法通过程序确定,那么是否存在近似值,例如100Hz?

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

只需按照Slider通知消息中的说明处理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);
}

我意识到我没有以正确的方式处理这个问题。滑块值的更改速率并不重要,重要的是跟随滑块值的速率。这两种利率是独立的。假设由滑块控制的参数在0到1的范围内,跟随滑块值的速率(r)和允许该值改变的最大频率(f)是转换速率限制器中应该使用的,以计算最大步长,如下所示:

s = 2 * f / r