1

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

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

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

4

2 回答 2

1

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

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

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

另一个(可能更好的)变体 - 设置后强制重绘滑块。

但是由于 MS trackbar 实现中的错误(或功能?),您不能只调用CWnd::Invalidate(用于延迟重绘)甚至CWnd::RedrawWindow(用于立即重绘)。这不会有任何影响。

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

const BOOL isEnabled = MFC_scKINECTANGLE->IsWindowEnabled();

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

有关详细信息,请参阅此讨论

于 2012-10-09T13:14:08.830 回答
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
}
于 2016-07-08T21:31:53.220 回答