誰かが手助けをしてもらえるよう、問題を十分に説明できることを願っています。「スマート」リンクスクロールバーとエディットコントロール?
基本的には、水平スクロールバー(0〜1000の範囲)と、スクロールバーの位置を1000で割った位置を表す編集コントロールがあるため、ユーザーはスクロールバーを使用して0〜 1から3小数点までの精度(.001、.002、...、.987など)を入力するか、エディットボックスに自分の番号を入力します。スクロールバーをスクロールすると、編集コントロールの番号が新しいスクロール位置に反映されます。新しい番号が入力されると、スクロールバーは入力された番号を反映した新しい位置に自分自身を設定します。一方、私はまた、(スクロールバーまたはエディットコントロールのいずれかを介して)変更されると、この数値でいくつかの計算を行い、結果を別のダイアログで表示します。
これは私の問題です。ユーザーがエディットコントロールに数値を入力したときに、適切な動作を生成するために使用するイベントハンドラを決定することができません。
私は、私の編集コントロールを処理するためにfuelMarginという二重値変数と、スクロールバーを処理するfuelScrollというCScrollBarコントロール変数を使用しています。
私のHSCROLLイベントでは、編集コントロールをスクロール位置/ 1000に設定しました。問題はありません。ユーザーがスクロールバーをスクロールすると、編集ボックスが正しく更新されます。エディットボックスのよう
、私の最初の試みは、onChangeイベントだった:
void MarginDlg::OnEnChangeFueledit()
{
CEdit* editBox;
editBox = (CEdit*)GetDlgItem(IDC_FUELEDIT);
CString editString;
editBox->GetWindowText(editString);
if (editString.Compare(".") != 0 && editString.Compare("0.") != 0
&& editString.Compare(".0") != 0 && editString.Compare("0.0") != 0
&& editString.Compare(".00") != 0 && editString.Compare("0.00") != 0)
{
UpdateData();
UpdateData(FALSE);
if (fuelMargin > 1)
{
UpdateData();
fuelMargin = 1;
UpdateData(FALSE);
}
if (fuelMargin < 0)
{
UpdateData();
fuelMargin = 0;
UpdateData(FALSE);
}
fuelScroll.SetScrollPos(int(fuelMargin*1000));
}
}
ユーザーが番号を入力しようとしているとき、私は)にupdateDataを(やってから保つためにそこにいるかの最初の文を必要と.5または.05または.005のように。しかし、それはいくつかの不運な行動を引き起こします。ユーザーが.56のようなものを入力しようとすると、UpdateData()が実行された後に数字が0.5になり、カーソルが一番左に移動するので、.56を入力しようとすると、 60.5を入力すると1になります。なぜなら、0より小さい数または1より大きい数を入力させないからです。しかし、0.56を入力すると、この動作は回避されます。
私の第二の試みのために、私は私のonChangeイベントをコメントアウトし、代わりにONKILLFOCUSイベントに置く:
void MarginDlg::OnEnKillfocusFueledit()
{
UpdateData();
UpdateData(FALSE);
if (fuelMargin > 1)
{
UpdateData();
fuelMargin = 1;
UpdateData(FALSE);
}
if (fuelMargin < 0)
{
UpdateData();
fuelMargin = 0;
UpdateData(FALSE);
}
fuelScroll.SetScrollPos(int(fuelMargin*1000));
}
だから今、ユーザーが自分の番号を入力し終えることができると、すべてが互角のドーリーです - 限り、彼らとしては、編集ボックスをクリックします。スクロールバーは移動せず、ボックスがフォーカスを失うまで結果は計算されません。
ボックス内の数字が入力されると結果が計算されます。数字が入力されると、スクロールバーが動くようにしたい。しかし、私は入力を中断させたくない、すなわちボックス内の実際の数字が変更されたか、カーソルが何らかの形で動いた。
提案?
ありがとうございます!
私はこの方法を私のオンキーに使用しました。私は結果に非常に満足しています。ありがとう! 私はkillfocusでエラーチェックを最小限に抑えています。つまり、数値が範囲内にあることを確認し、そうでない場合は0または1に設定します(それに応じてスクロールバーを更新します)。私はそこに私の結果を更新したいと思いますが、私はいくつかの問題を抱えています...私は現在、それをデバッグ中です。しかし、あなたの解決には非常に感謝します。 – Lauren