• [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

  • 相关阅读:
    svn自动部署
    【阿里云】Windows2008 FTP配置指南
    thinkphp 3.2多语言设置
    iphone、ipod Touch、ipad触屏时的js事件
    Nginx区分PC或手机访问不同网站
    Nginx Location配置总结及基础最佳实践
    阿里云官方教程 Linux 系统挂载数据盘
    利用php调用so库文件中的代码
    LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)
    Android深入理解Context(三)Context完全解析
  • 原文地址:https://www.cnblogs.com/zwh0214/p/6290212.html
Copyright © 2020-2023  润新知