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

別の(そしておそらくより良い)変形-セットアップ後にスライダーを強制的に再描画します。

CWnd::Invalidateただし、MSトラックバーの実装のバグ(または機能?)が原因で、 (遅延再描画の場合)または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()を呼び出すと、50ではなく0が返されていました。

私にとってそれが機能したのは、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 に答える