更新MFC的CSliderCtrl

时间:2012-10-09 12:58:32

标签: c++ mfc slider

我正在开发一个C ++ MFC项目,并在下面进行讨论。我的表单上有一个CSliderCtrl,我称之为MFC_scKINECTANGLE。为了使它成为我想要的方式,使用下一段代码:

MFC_scKINECTANGLE = (CSliderCtrl * ) GetDlgItem(SC_kinectAngle);
MFC_scKINECTANGLE->SetRangeMax(27);
MFC_scKINECTANGLE->SetRangeMin(-27);        
MFC_scKINECTANGLE->SetPos(0);

问题是程序开头的滑块位于条形的顶部,而它应该在中间,当你试图抓住它时,它会突然跳到正确的位置并在此之后正常工作。如何在程序开始时确保滑块位于栏的中间?

2 个答案:

答案 0 :(得分:1)

根据MSDN CSliderCtrl::SetRangeMaxCSliderCtrl::SetRangeMin类似):

void SetRangeMax(
   int nMax,
   BOOL bRedraw = FALSE 
);

您需要将bRedraw参数设置为TRUE才能更新滑块。

另一个(可能更好)变体 - 在安装后强制重绘滑块。

但由于MS轨迹栏实现中的错误(或功能?),您不能只调用CWnd::Invalidate(延迟重绘)或CWnd::RedrawWindow(立即重绘)。这没有效果。

幸运的是,有几个事件迫使轨迹栏重新绘制,例如启用/禁用窗口:

const BOOL isEnabled = MFC_scKINECTANGLE->IsWindowEnabled();

MFC_scKINECTANGLE->EnableWindow(!isEnabled);
MFC_scKINECTANGLE->EnableWindow(isEnabled);

有关详细信息,请参阅this discussion

答案 1 :(得分:0)

我在对话框的构造函数中设置了范围(0 - 100)和位置(50)。滑块最初显示在位置0处。如果我在SetPos()之后立即调用了GetPos(),则返回0而不是50。

让它对我有用的是覆盖OnInitDialog()并设置范围&在那里而不是在构造函数中。

BOOL CVolumeDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    m_VSliderBarNormal.SetRange(0, 100, TRUE);
    m_VSliderBarNormal.SetPos(50);

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}