下边是三种限制编辑框输入内容的方法。在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 < '' || pMsg->wParam > '')) //如果输入的字符在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 = -;

         for (int i=; i<strNum.GetLength(); i++)

         {

              if (strLimited.Find(strNum[i]) == - && strLimited != _T("")) // 逐个字符在所限制的字符集中查找

              {

                   strNum = strNum.Left(i) + strNum.Mid(i + ); // 从非法字符的输入位置处截断(不包括非法字符)

                   iPos = i; // 记下截断的位置

                   i--;

              }

         }

         if (strNum.GetLength() > nLenLimit && nLenLimit != )

         {

              strNum.Delete(nLenLimit, strNum.GetLength() - nLenLimit); //  若总长度大于限制的输入长度,则将超长部分删掉

              iPos = editCtrl.GetSel() % ;

         }

         if (iPos != -) // 判断位置变量状态

         {

              editCtrl.SetWindowText(strNum); // 重新设置编辑框的文本

              editCtrl.SetSel(iPos, iPos); // 定位光标

         }

         sIsIn = false;

     }

}

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

void CCMyEditDlg::OnEnChangeMyEdit()

{

     EditCtrlLimit(m_edit_LimitInput, , "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 >= '' && ch <= '')||
(ch >= 'a' && ch <= 'f')||
(ch >= 'A' && ch <= 'F')||
ch == VK_BACK || ch == VK_DELETE||
nChar == || nChar == || //ctrl + a c
nChar == || nChar == ) //ctrl + x v) //msdn的virtual key
{
CEdit::OnChar(ch, nRepCnt, nFlags);
}
}

EditControl 限制输入文本的三种方法的更多相关文章

  1. Vue-Vue文本渲染三种方法 {{}}、v-html、v-text

    {{ }} 将元素当成纯文本输出 v-htmlv-html会将元素当成HTML标签解析后输出 v-textv-text会将元素当成纯文本输出 代码: <!DOCTYPE html> < ...

  2. Linux中让终端输入变为非阻塞的三种方法

    介绍 在linux下每打开一个终端,系统自动的就打开了三个文件,它们的文件描述符分别为0,1,2,功能分别是"标准输入"."标准输出"和"标准错误输出 ...

  3. Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!

    大网站都有推出自己的手机访问版本页面,不管是新闻类还是视频网站,我们在电脑是无法直接访问到手机网站的,比如我经常访问一个3g.qq.com这个手机站点,如果在电脑上直接打开它,则会跳转到其它页面,一般 ...

  4. struts2 Action 接收参数的三种方法

    刚学Struts2 时 大家可能遇到过很多问题,这里我讲一下Action 接收参数的三种方法,我曾经在这上面摔过一回.所以要警醒一下自己..... 第一种:Action里声明属性,样例:account ...

  5. 三种方法为QLineEdit添加清除内容按钮

    很多时候我们会发现输入的一长串内容不得不全部删除重新输入,这时比起一直按着退格键不放一个清除内容按钮更受欢迎. 今天我将介绍三种为QLineEdit添加清除内容按钮的方法,其中两种方法有较强的功能针对 ...

  6. NGUI制作字体的三种方法

    主要参考两篇博文: (1).NGUI制作字体的三种方法 (2).使用位图字体工具BMFont从图片生成自定义字体 1.BMFont下载地址 http://www.angelcode.com/produ ...

  7. 用Fiddler可以设置浏览器的UA 和 手动 --Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!

    附加以一种软件的方法是:用Fiddler可以设置浏览器的UA 以下3种方法是手动的 通过伪装User-Agent,将浏览器模拟成Android设备. 第一种方法:新建Chrome快捷方式 右击桌面上的 ...

  8. VC中加载LIB库文件的三种方法

    VC中加载LIB库文件的三种方法 在VC中加载LIB文件的三种方法如下: 方法1:LIB文件直接加入到工程文件列表中   在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中&quo ...

  9. VC6.0加载lib文件的三种方法

    MFC编写程序,都要用到动态链接库,MFC相关的动态库有MFCD42和MFC42等,MFC框架程序已经自动加载,那么如何引入第三方的动态链接库到工程中呢? 静态链接库是要先把程序中所需要使用的函数编译 ...

随机推荐

  1. 分拆数&&HDU4651

    1,有两种DP,复杂度都是O(N^2),但是浪费的侧重点不同,所以根据侧重点分块DP,复杂度可以降到O(N^1.5). 2,母函数+五边形blabla... 占位. 其实就是母函数拆开后,快速知道哪些 ...

  2. [转]python_常用断言assert

    原文地址:http://www.jianshu.com/p/eea0b0e432da python自动化测试中寻找元素并进行操作,如果在元素好找的情况下,相信大家都可以较熟练地编写用例脚本了,但光进行 ...

  3. snnu(1110) 传输网络 (并查集+路径压缩+离线操作 || 线段树)

    1110: 传输网络 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 43  Solved: 18[Submit][Status][Web Board] ...

  4. bzoj 4596

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 257  Solved: 152[Submit][Sta ...

  5. 字节流与字符流简单操作(OutputStream、InputStream、Writer、Reader)

    操作流程 使用File类打开一个文件 通过字节流或者字符流的子类.指定输出的位置. 进行读/写操作 关闭输入/出 字节流与字符流 在java.io包中操作文件内容主要有两大类:字节流字符流.两大类分为 ...

  6. PCB Redis的安装使用

    记录一下Redis的安装与基本使用 一.Redis简介 Redis(REmote DIctionary Server)远程字典服务器,免费开源,是一个高性能的(Key/Value)分布式内存数据库.其 ...

  7. bzoj 4184: shallot【线性基+时间线段树】

    学到了线段树新姿势! 先离线读入,根据时间建一棵线段树,每个节点上开一个vector存这个区间内存在的数(使用map来记录每个数出现的一段时间),然后在线段树上dfs,到叶子节点就计算答案. 注意!! ...

  8. golang——关于for循环的学习

    1.for循环的用法 (1)常规用法 func main() { slice := []int{1, 2, 3, 4, 5, 6} //方式1 for i := 0; i < len(slice ...

  9. NOIP-2018

    时隔一年,再度踏入NOIp的考场,内心感慨万分 Day0 在中巴上昏睡了3h++,终于到了长沙理工大学,国际学术交流中心......不太对,好像是国际交流中心与综合实验楼连线--理工大学的另一个大门外 ...

  10. _bzoj1798 [Ahoi2009]Seq 维护序列seq【线段树 lazy tag】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 注意,应保证当前节点维护的值是正确的,lazy tag只是一个下传标记,在下传时应即时 ...