[MFC] 编辑框 EditControl 输入数字范围限制

在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

原文地址:https://www.cnblogs.com/zwh0214/p/6290212.html