奇怪的现象:编辑框控件绑定double类型值,当输入0时,调用Updatedata(TRUE)之后自动变成其他的值?

现象:

做项目时,在将基于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替换成这个就能完美解决了!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
首先,在对话框的.h文件中声明变量m_second和second: ```cpp class CMyDialog : public CDialogEx { // ... private: CString m_second; int second; // ... }; ``` 然后,在对话框的.rc文件中添加一个编辑件: ```xml CONTROL "",IDC_EDIT_SECOND,"EDIT",ES_AUTOHSCROLL | ES_NUMBER | WS_BORDER,15,80,40,14 ``` 在对话框的.cpp文件中,通过DDX_Control函数和IDC_EDIT_SECOND件ID将编辑件与变量m_second: ```cpp void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); // ... DDX_Control(pDX, IDC_EDIT_SECOND, m_editSecond); DDX_Text(pDX, IDC_EDIT_SECOND, m_second); // ... } ``` 接下来,在件失去焦点的消息响应函数里,将m_second的转为int变量second,并检查其是否在0到59之间: ```cpp void CMyDialog::OnEnKillfocusEditSecond() { UpdateData(TRUE); CString strTemp; int nTemp = 0; if (!m_second.IsEmpty()) { nTemp = _ttoi(m_second); if (nTemp < 0 || nTemp > 59) { strTemp.Format(_T("输入有误,应输入0到59之间的数字!")); MessageBox(strTemp); nTemp = 0; } } second = nTemp; UpdateData(FALSE); } ``` 其中,_ttoi函数用于将CString类型转为int类型。如果转换失败,返回0。如果转换成功,检查其是否在0到59之间,若不在,则弹出提示框提醒用户重新输入。 最后,记得在OnInitDialog函数中初始化m_second和second变量: ```cpp BOOL CMyDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // ... m_second = _T("0"); second = _ttoi(m_second); UpdateData(FALSE); // ... } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w946995383_02

觉得有帮助就给点分吧,谢谢了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值