下边是三种限制编辑框输入内容的方法。在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); } }