现象:
做项目时,在将基于MFC的应用程序移植到目标设备PC上时,偶然发现 编辑框控件绑定double类型值,当输入0时,调用Updatedata(TRUE)之后自动变成其他的值 ,但是在自己电脑上编译,运行,调试,都没有发现问题。于是乎就在设备PC上安装了vs2015,进入调试,发现了问题所在:
Updatedata(TRUE)之后,响应数据交换函数:void CXXXDlg::DoDataExchange(CDataExchange* pDX) 中的 DDX_Text(pDX, IDC_EDIT1, m_dbValue)之后,m_dbValue的值就变成了其他某个编辑框控件的值的小数部分,
注意:当且仅当输入“0”时,才会发生这一现象,输入“0.0”都不会;好奇怪是吧!
解决方法:
重写DDX_Text的功能,在stdafx.cpp中加上这些代码:
void DDX_Text_EX(CDataExchange* pDX, int nIDC, double& value)
{
if (pDX->m_bSaveAndValidate)
{
CString str;
GetDlgItemText(pDX->m_pDlgWnd->GetSafeHwnd(), nIDC, str.GetBuffer(), 255);
value = _wtof(str);
}
else
{
CString str;
CString tmp;
// 这里有个小问题:
// 将输入的double类型值转换为字符串,如果输入“0”,转换为“0.000000”,如果直接输出到控件,达不到“所见即所得”的效果
// 因此需要将格式化后的字符串再 【处理一番】,
tmp.Format(_T("%lf"), value);
// 【处理一番】 实现6位小数精度以内的double类型值‘等长’转换为浮点型
if (1)
{
while (tmp.Mid(tmp.GetLength() - 1).Compare(_T("0")) == 0)//去掉小数点后的0
{
tmp = tmp.Mid(0, tmp.GetLength() - 1);
}
int nf = tmp.Find(_T("."));
if (nf == tmp.GetLength() - 1) // 无小数点
{
str = tmp.Left(tmp.GetLength() - 1);
}
else
{
int nCnts = 0;
nCnts = tmp.GetLength() - tmp.Find(_T(".")) - 1;
str.Format(_T("%%.%dlf"), nCnts); // 格式化需要输出几位小数,如“%.4f”;
str.Format(str, value); // 得到需要输出到控件上的文本
}
}
SetDlgItemText(pDX->m_pDlgWnd->GetSafeHwnd(), nIDC, str);
}
}
别忘了在头文件中声明这个DDX_Text_EX;
最后将所有绑定double变量的编辑框控件的DDX_Text替换成这个就能完美解决了!