在MFC中,项目需要对编辑框EditControl的数字输入范围进行限制,主要有以下实现方式,各有优缺点,个人推荐最后一个。
第一种:添加变量
为编辑框添加int、float变量的时候,可以填写最大值与最小值;或者自己添加代码DDV_MinMaxInt(pDX, m_nNum, 1, 65535);
测试发现:
只有在UpdateData(true)更新变量之后,才会对该变量的值进行判断,并弹出对话框提醒。
但仅仅是提醒,关闭提示框之后,错误数据仍会显示在编辑框上。
注意:无UpdateData(true),无判断提示。
第二种:控件的EN_KillFocus事件(失去焦点事件)
当失去焦点时候,UpdateData(true),同步一下窗体和相关变量的值,这样子系统才能正确判断是否超过设定的范围。
代码如下:
void CParaConfigDlg::OnEnKillfocusReceivergain() { UpdateData(true); if ((m_nReceiverGain<0) || (m_nReceiverGain>76)) { MessageBoxA(_T("数值超过范围!"), _T("错误"), MB_OK); } }
有一种说法是:只要你输入的值不在设定范围里,那么你的焦点就不能离开控件,因为会一直弹窗提示的。
但经过我实际测试了下,发现弹框结束后焦点是离开的,这个只是在失去焦点时进行的一次判断,超出则提示。
当然在这里我们可以进行如下更改:
void CParaConfigDlg::OnEnKillfocusReceivergain() { UpdateData(true); if ((m_nReceiverGain<0) || (m_nReceiverGain>76)) { MessageBoxA(_T("数值超过范围!"), _T("错误"), MB_OK); (CEdit*)GetDlgItem(IDC_ReceiverGain)->SetFocus(); //设置焦点 } }
这样就能保持不输入正确格式,焦点就不能离开控件。包括关闭,取消等按钮点击事件。
看了别人的文章,这里可能会有一个问题:
程序用户可能在输入之后没有让编辑框失去焦点,而是直接按回车键进入下一步操作,那么本文上面所说的则会有问题。
第三种:控件的EN_CHANGE事件(文本更改以后显示更新事件)
代码都一样,同上。
这里的问题是:这个事件也是在文本改变后进行判断提示,关闭提示后,你改变其他参数,不会再次触发,因为你没有再改变。
即:改变一次,触发一次。
第四种:控件的EN_UPDATE事件(控件即将显示更改的文本事件)
代码都一样,同上。
这里的问题是:这个事件也是在文本即将显示时进行判断提示,关闭提示后,你改变其他参数,不会再次触发,因为你没有需要再显示。
即:需要显示一次,触发一次。
第五种:自己完善的(个人推荐)
以EN_KillFocus事件为例:
void CParaConfigDlg::OnEnKillfocusReceivergain() { float aa = m_nReceiverGain; UpdateData(true); if ((m_nReceiverGain<0) || (m_nReceiverGain>76)) { MessageBoxA(_T("数值超过范围!"), _T("错误"), MB_OK); m_nReceiverGain = aa; UpdateData(false); } }
主要是添加了历史数据保存,如果数据不合法,则还原原始数据。
特别提醒下:这种方法我使用过程中发现EN_UPDATE(),EN_CHANGE()事件有些问题。
例如以EN_UPDATE()为例:数字范围为12-76,我想输入26,那么开始输入2时就会报错,导致输入不了其他值。或者已经为26,我想改为36,也会导致6删除不了。
EN_CHANGE事件应该也会有类似的问题,同理。自己理解下这个思想,自己进行变通就行了。
因此该方法最好使用EN_KillFocus失去焦点事件。
参考:http://www.cnblogs.com/ziwuge/archive/2011/11/15/2249541.html