我想确定在基于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的?
答案 0 :(得分: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);
}
答案 1 :(得分:0)
我意识到我没有以正确的方式解决这个问题。滑块值改变的速率并不重要,重要的是滑块值的跟随速率。这两个比率是独立的。假设由滑块控制的参数在0到1的范围内,则跟随滑块值的速率(r)和允许值改变的最大频率(f)应该在转换速率限制器计算最大步长(s),如下:
s = 2 * f / r