我正在开发一个C ++ MFC项目,并在下面进行讨论。我的表单上有一个CSliderCtrl,我称之为MFC_scKINECTANGLE。为了使它成为我想要的方式,使用下一段代码:
MFC_scKINECTANGLE = (CSliderCtrl * ) GetDlgItem(SC_kinectAngle);
MFC_scKINECTANGLE->SetRangeMax(27);
MFC_scKINECTANGLE->SetRangeMin(-27);
MFC_scKINECTANGLE->SetPos(0);
问题是程序开头的滑块位于条形的顶部,而它应该在中间,当你试图抓住它时,它会突然跳到正确的位置并在此之后正常工作。如何在程序开始时确保滑块位于栏的中间?
答案 0 :(得分:1)
根据MSDN CSliderCtrl::SetRangeMax
(CSliderCtrl::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
}