我正在做一个C++的MFC项目,并在以下内容中遇到了问题。我的表单上有一个我称为MFC_scKINECTANGLE的CSliderCtrl。为了让它像我想要的那样,使用下一段代码:
MFC_scKINECTANGLE = (CSliderCtrl * ) GetDlgItem(SC_kinectAngle);
MFC_scKINECTANGLE->SetRangeMax(27);
MFC_scKINECTANGLE->SetRangeMin(-27);
MFC_scKINECTANGLE->SetPos(0);问题是程序开始时的滑块在条的顶部,而它应该在中间,当你试图抓住它时,它会突然跳到正确的位置,然后就可以正常工作了。如何确保滑块在程序开始时位于条的中间?
发布于 2012-10-09 21:14:09
根据MSDN CSliderCtrl::SetRangeMax (CSliderCtrl::SetRangeMin类似):
void SetRangeMax(
int nMax,
BOOL bRedraw = FALSE
);需要将bRedraw参数设置为TRUE才能更新滑块。
另一个(可能更好的)变力在设置后重新绘制滑块。
但是由于bug (或者特性?)在MS跟踪条实现中,您不能只调用CWnd::Invalidate (用于延迟重绘)或甚至CWnd::RedrawWindow (用于立即重绘)。这将不会有任何效果。
幸运的是,有几个事件会强制trackbar重新绘制,例如启用/禁用窗口:
const BOOL isEnabled = MFC_scKINECTANGLE->IsWindowEnabled();
MFC_scKINECTANGLE->EnableWindow(!isEnabled);
MFC_scKINECTANGLE->EnableWindow(isEnabled);详情请参见this discussion。
发布于 2016-07-09 05:31:53
我在对话框的构造函数中设置了范围(0 - 100)和位置(50)。滑块最初一直显示在位置0。如果我在SetPos()之后调用GetPos(),它返回的是0而不是50。
我使用它的原因是重写了OnInitDialog()并设置了range & position,而不是在构造函数中。
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
}https://stackoverflow.com/questions/12800581
复制相似问题