【发布时间】:2009-06-16 20:58:10
【问题描述】:
我希望我能很好地解释我的问题,以便有人提供帮助。
基本上,我有一个水平滚动条(范围为 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));
}
}
当用户尝试键入像 .5 或 .05 或 .005 这样的数字时,我需要其中的第一个 if 语句来防止执行 UpdateData()。不过,它确实会产生一些不稳定的行为。当用户尝试输入 .56 之类的内容时,在 .5 执行 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));
}
所以现在用户可以完成输入他们的号码并且一切都很好 - 只要他们点击编辑框。在框失去焦点之前,滚动条不会移动,也不会计算结果。
我希望在输入框中的数字时计算结果;我希望滚动条在输入数字时移动。但我不希望打字被打乱,即框中的实际数字发生变化或光标以任何方式移动。
建议?
谢谢!
【问题讨论】:
标签: c++ visual-studio-2008 visual-c++ mfc