• EditControl 限制输入文本的三种方法


    下边是三种限制编辑框输入内容的方法。在VS里建立基于对话框的应用程序CMyEdit,打开资源视图,删除对话框上自带的确定和取消按钮。然后添加一编辑框控件,将其ID修改为IDC_MY_EDIT,通过类向导给该编辑框添加控件变量m_edit_LimitInput。

     

         比如,现在想在编辑框里只能输入十六进制数,即“0123456789ABCDEFabcdef”这些字符。

    方法一:拦截消息

    BOOL CCMyEditDlg::PreTranslateMessage(MSG* pMsg)
    
    {
    
         // TODO: 在此添加专用代码和/或调用基类
    
     
    
         if ( WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST) //键盘消息
    
         {
    
             DWORD dwEditId = GetFocus()->GetDlgCtrlID(); // 获取编辑框的ID
    
     
    
             if(dwEditId == IDC_MY_EDIT)
    
             {
    
                  if((pMsg->wParam < '0' || pMsg->wParam > '9')) //如果输入的字符在0-9的范围外,则终止当前操作,否则接受输入
    
                  {
    
                       return true;
    
                  }
    
             }
    
         }
    
         return CDialog::PreTranslateMessage(pMsg);
    
    }

     

    方法二:控件消息处理

    在CCMyEditDlg.h文件中添加函数EditCtrlLimit声明

    void EditCtrlLimit(
    
      CEdit &editCtrl, //编辑框控件变量
    
      int nLenLimit, //限制输入的长度
    
      CString strLimited //限制可输入的字符集
    
    );

    在.cpp文件中添加EditCtrlLimit函数的实现部分

     

    void CCMyEditDlg::EditCtrlLimit(CEdit &editCtrl, int nLenLimit, CString strLimited)
    
    {
    
         static bool sIsIn = false;
    
         if (!sIsIn)
    
         {
    
             sIsIn = true;
    
             CString strNum;
    
             editCtrl.GetWindowText(strNum); // 获取编辑框的文本
    
     
    
             int  iPos = -1;
    
             for (int i=0; i<strNum.GetLength(); i++)
    
             {
    
                  if (strLimited.Find(strNum[i]) == -1 && strLimited != _T("")) // 逐个字符在所限制的字符集中查找
    
                  {
    
                       strNum = strNum.Left(i) + strNum.Mid(i + 1); // 从非法字符的输入位置处截断(不包括非法字符)
    
                       iPos = i; // 记下截断的位置
    
                       i--;
    
                  }
    
             }
    
             if (strNum.GetLength() > nLenLimit && nLenLimit != 0)
    
             {
    
                  strNum.Delete(nLenLimit, strNum.GetLength() - nLenLimit); //  若总长度大于限制的输入长度,则将超长部分删掉
    
                  iPos = editCtrl.GetSel() % 256;
    
             }
    
             if (iPos != -1) // 判断位置变量状态
    
             {
    
                  editCtrl.SetWindowText(strNum); // 重新设置编辑框的文本
    
                  editCtrl.SetSel(iPos, iPos); // 定位光标
    
             }
    
             sIsIn = false;
    
         }
    
    }

     

    接着给编辑框添加EN_CHANGE消息函数,然后在里边添加如下代码

     

    void CCMyEditDlg::OnEnChangeMyEdit()
    
    {
    
         EditCtrlLimit(m_edit_LimitInput, 16, "0123456789ABCDEFabcdef"); // 限制长度和输入类型
    
    }

    注:方法二不仅可以限制文本框的输入内容,还可以限制其输入长度,同时可以屏蔽使用鼠标右键“粘贴”的功能(当粘贴进非法字符,或汉字),不失为一举多得一种方法。

     

     方法三,通过新建一个CLimitEdit类,该方法不能阻止鼠标粘贴非法字符:

    CLimitEdit.h头文件声明如下:

    class CLimitEdit : public CEdit
    {
        DECLARE_DYNAMIC(CLimitEdit)
     
    public:
        CLimitEdit();
        virtual ~CLimitEdit();
     
    protected:
        DECLARE_MESSAGE_MAP()
    public:
        afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
    };

    CLimitEdit.cpp文件如下:

    #include "stdafx.h"
    #include "LimitEdit.h"
     
     
    IMPLEMENT_DYNAMIC(CLimitEdit, CEdit)
     
    CLimitEdit::CLimitEdit()
    {
     
    }
     
    CLimitEdit::~CLimitEdit()
    {
    }
     
     
    BEGIN_MESSAGE_MAP(CLimitEdit, CEdit)
        ON_WM_CHAR()
    END_MESSAGE_MAP()
     
     
     
    // CLimitEdit 消息处理程序
    void CLimitEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
            TCHAR ch = nChar;
        if((ch >= '0' && ch <= '9')|| 
           (ch >= 'a' && ch <= 'f')|| 
           (ch >= 'A' && ch <= 'F')|| 
            ch == VK_BACK || ch == VK_DELETE||        
            nChar == 01 || nChar == 03 ||       //ctrl + a c
            nChar == 24 || nChar == 22)        //ctrl + x v) //msdn的virtual key 
        { 
            CEdit::OnChar(ch, nRepCnt, nFlags); 
        }
    }

     

  • 相关阅读:
    1.Python进阶 词典dict
    10.Python基础 反过头来看看
    test
    地图添加标记物 并添加点击弹出框
    百度地图里面添加覆盖物的事件显示最后一个?
    css3之animation制作闪烁文字效果 转
    ajax beforeSend中无效果
    jquery 中 $('div','li')是什么意思?
    SQL 单引号转义
    jQuery 遍历
  • 原文地址:https://www.cnblogs.com/2018shawn/p/9368229.html
Copyright © 2020-2023  润新知