首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新MFC的CSliderCtrl

更新MFC的CSliderCtrl
EN

Stack Overflow用户
提问于 2012-10-09 20:58:32
回答 2查看 2.3K关注 0票数 1

我正在做一个C++的MFC项目,并在以下内容中遇到了问题。我的表单上有一个我称为MFC_scKINECTANGLE的CSliderCtrl。为了让它像我想要的那样,使用下一段代码:

代码语言:javascript
复制
MFC_scKINECTANGLE = (CSliderCtrl * ) GetDlgItem(SC_kinectAngle);
MFC_scKINECTANGLE->SetRangeMax(27);
MFC_scKINECTANGLE->SetRangeMin(-27);        
MFC_scKINECTANGLE->SetPos(0);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-09 21:14:09

根据MSDN CSliderCtrl::SetRangeMax (CSliderCtrl::SetRangeMin类似):

代码语言:javascript
复制
void SetRangeMax(
   int nMax,
   BOOL bRedraw = FALSE 
);

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

另一个(可能更好的)变力在设置后重新绘制滑块。

但是由于bug (或者特性?)在MS跟踪条实现中,您不能只调用CWnd::Invalidate (用于延迟重绘)或甚至CWnd::RedrawWindow (用于立即重绘)。这将不会有任何效果。

幸运的是,有几个事件会强制trackbar重新绘制,例如启用/禁用窗口:

代码语言:javascript
复制
const BOOL isEnabled = MFC_scKINECTANGLE->IsWindowEnabled();

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

详情请参见this discussion

票数 1
EN

Stack Overflow用户

发布于 2016-07-09 05:31:53

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

我使用它的原因是重写了OnInitDialog()并设置了range & position,而不是在构造函数中。

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12800581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档