1.获取文本改变(输入更多字符时)的消息时,获取输入的内容,判断小数点后位数(笨办法是查找小数点位置),如果超出要求,就通过sprintf使用%.5f这样的办法,把输入的数字改为符合需求的格式,然后更新编辑框里面的文本。
2.双击Edit控件,添加消息处理函数,将上面这段代码放在里面.
可以这样(Unicode版本)
CString strText, strTemp;
// 为edit控件绑定变量m_EditText
//获取控件的内容
m_EditText.GetWindowText(strText);
//定位小数点
int nPos = strText.Find(_T('.'));
if(n != -1)
{
//获取小数点后面的数据
strTemp = strText.Mid(n+1);
//如果长度大于5,则忽略后面的数据
if(strTemp.GetLength() > 5)
{
strText.Format(_T("%.5f"), _tstof(strText.GetBuffer()));
strText.ReleaseBuffer();
m_EditText.SetWindowText(strText);
}
}
---------------------------------------------------------------------------------------------------------------------------------------
这涉及2种作法
1、直接有接收框的事件处理中进行输入限制,当输入长度超过时禁止再输入。此法的缺点的编程较复杂,必须处理好各个输入事件。
2、在输入结束离开接收框时处理,即后处理。此法优点是处理简单。
------------------------------------------------------------------------------------------------------------------------------------------------
我是这样想的:给编辑框设置一个成员变量m_aa,再定义一个CString str,通过str.Format()来实现格式化输出,在编辑框失去焦点时触发事件。代码是这样的:
void CCurve_testDlg::OnKillfocusEdit1()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
float naa; //编辑框输入值
CString str; //定义一个字符串型变量
naa=m_aa;
str.Format(_T("%.5f"),naa); //格式化输出,%.5f是指保留小数点后5位小数
m_aa=atof(str); //将转化后的值显示在编辑框上
UpdateData(FALSE);
}
可是在使用的时候遇到了问题,界面上有三个编辑框(m_aa,m_bb,m_cc),对每个编辑框采取以上处理,只有第一个编辑框实现了小数点后保留5位小数,而其他两个编辑框都无法实现(第二个编辑框小数点后保留了4位小数,第三个保留了3个小数,这样递减)。我不知道这是什么原因。。。
-------------------------------------------------------------------------------------------------------------------------------
这个是我按照你的思路写出来,基本没有区别,也实现了你想要的功能
UpdateData(TRUE);
float naa = m_aa;
CString str;
str.Format(_T("%.5f"), naa);
m_aa = _tstof(str.GetBuffer());
str.ReleaseBuffer();
UpdateData(FALSE);
你可以检查一下三个控件变量,看看有什么问题没有,比如设置断点看看,是否获取到了你输入的值,而这个值又是在哪里被改写了。
----------------------------------------------------------------------------------------------------------------------
编写一个EDIT类,里面加判断,你这样写的话有很多BUG,比如可用输入字母、输入多个小数点、输入多个符号,还有中文等等。