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 < '' || 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 限制输入文本的三种方法的更多相关文章
- Vue-Vue文本渲染三种方法 {{}}、v-html、v-text
{{ }} 将元素当成纯文本输出 v-htmlv-html会将元素当成HTML标签解析后输出 v-textv-text会将元素当成纯文本输出 代码: <!DOCTYPE html> < ...
- Linux中让终端输入变为非阻塞的三种方法
介绍 在linux下每打开一个终端,系统自动的就打开了三个文件,它们的文件描述符分别为0,1,2,功能分别是"标准输入"."标准输出"和"标准错误输出 ...
- Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!
大网站都有推出自己的手机访问版本页面,不管是新闻类还是视频网站,我们在电脑是无法直接访问到手机网站的,比如我经常访问一个3g.qq.com这个手机站点,如果在电脑上直接打开它,则会跳转到其它页面,一般 ...
- struts2 Action 接收参数的三种方法
刚学Struts2 时 大家可能遇到过很多问题,这里我讲一下Action 接收参数的三种方法,我曾经在这上面摔过一回.所以要警醒一下自己..... 第一种:Action里声明属性,样例:account ...
- 三种方法为QLineEdit添加清除内容按钮
很多时候我们会发现输入的一长串内容不得不全部删除重新输入,这时比起一直按着退格键不放一个清除内容按钮更受欢迎. 今天我将介绍三种为QLineEdit添加清除内容按钮的方法,其中两种方法有较强的功能针对 ...
- NGUI制作字体的三种方法
主要参考两篇博文: (1).NGUI制作字体的三种方法 (2).使用位图字体工具BMFont从图片生成自定义字体 1.BMFont下载地址 http://www.angelcode.com/produ ...
- 用Fiddler可以设置浏览器的UA 和 手动 --Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!
附加以一种软件的方法是:用Fiddler可以设置浏览器的UA 以下3种方法是手动的 通过伪装User-Agent,将浏览器模拟成Android设备. 第一种方法:新建Chrome快捷方式 右击桌面上的 ...
- VC中加载LIB库文件的三种方法
VC中加载LIB库文件的三种方法 在VC中加载LIB文件的三种方法如下: 方法1:LIB文件直接加入到工程文件列表中 在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中&quo ...
- VC6.0加载lib文件的三种方法
MFC编写程序,都要用到动态链接库,MFC相关的动态库有MFCD42和MFC42等,MFC框架程序已经自动加载,那么如何引入第三方的动态链接库到工程中呢? 静态链接库是要先把程序中所需要使用的函数编译 ...
随机推荐
- HDU - 2066 一个人的旅行(最短路径)(模板)
d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到这个城市的距离设为0),草儿想去的地方有D个: 求D个城市中距离草儿家最近的距离. s.进行1次单源最短路,找出 ...
- easy_install uncompyle6 egg
localhost:~ # easy_install uncompyle6-3.0.1-py3.6.eggProcessing uncompyle6-3.0.1-py3.6.eggCopying un ...
- 如何制作.a静态库?合成多架构静态库?
08_01静态库 08_02制作静态库 .a 1.新建项目com+shift+n:选择Framework&Library. 2.下一步. 项目名不能为中文. 3.编写代码之后.用真机运行.会自 ...
- JS处理时间相关
<script>var d=new Date(); alert(d);alert(d.getMonth());alert(d.getHours());alert(d.getYear()); ...
- [转]响应式web设计之CSS3 Media Queries
开始研究响应式web设计,CSS3 Media Queries是入门. Media Queries,其作用就是允许添加表达式用以确定媒体的环境情况,以此来应用不同的样式表.换句话说,其允许我们在不改变 ...
- ASP.NET Core MVC 打造一个简单的图书馆管理系统 (修正版)(三)密码修改以及密码重置
前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/as ...
- 数论(GCD) HDOJ 4320 Arcane Numbers 1
题目传送门 题意:有一个A进制的有限小数,问能否转换成B进制的有限小数 分析:0.123在A进制下表示成:1/A + 2/(A^2) + 3 / (A^3),转换成B进制就是不断的乘B直到为0,即(1 ...
- 题解报告:hdu 1166 敌兵布阵(线段树or树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头 ...
- Eclipse快捷键集合
***eclipse查看哪个方法被调用:选中,右键选择Open call Hierarchy 选择要查看的方法: ctrl + alt + h 查看一个类被那些类继承或者实现: F ...
- SPFarm.local返回值为null
创建了一个控制台应用程序,想输出SP2010服务器场下所有对象模型信息,结果:SPFarm.local返回值为null. 经查询解决方法: 1 .net framework版本要使用3.5: 2 目标 ...