CEdit限定输入的字符长度

时间:2021-08-29 16:20:25

想要实现在输入edit文本信息时,限制住输入的字符长度,势必要用到OnChar消息。

当我重写这个消息之后,发现了一些问题:

1:为什么重新后的消息不能响应键盘的Backspace?只能响应Delete消息?

2:我在重写的OnChar消息中,当获取当前文本内容时,和输入的内容不符?


在此,我可以分享下我的思路:

当前m_nLength表示设置限定字符串长度的个数

第一步:获取以往现有的字符串内容

使用GetWindowText

CStringW    strText0;
GetWindowText(strText0);
int nFirstLen = strText0.GetLength();

在此处就会遇到我上面所说的问题(2)了。

因为我获取edit控件的文本时,是在使用CEdit::OnChar消息之前,所以,每次获取都只能获取到录入之前的内容。

只有在CEdit::OnChar消息之后获取的文本才是输入后的信息。

第二步:判断以前文本长度 大于 设定的字符串的长度

if (strText0.GetLength() >= m_nLength )
{
	OutputDebugString(L"原始文本已经超出范围\r\n");
	return;
}

在这里就会出现了上文我说的问题(1)了。居然不响应Backspace消息?我记得自己没有拦截这个消息,也没有想到是为什么。

后来看到了有关于Edit的键盘消息的走向,我才发现了问题出在什么地方。

当使用键盘消息时,在程序中的过程是这样的:

OnKeyDown ---->>> OnChar ------>>> OnKeyUp

在这里,我直接把当长度大于设定长度时 ,Return了。这里把后面的消息拦截了。

所以,想要响应键盘消息时,应该进行以下修改

if (strText0.GetLength() >= m_nLength && m_nLength != -100 )
{
	OutputDebugString(L"原始文本已经超出范围\r\n");
	if (nChar == 8 )
	{
		CEdit::OnChar(nChar , nRepCnt , nFlags);
		return;
	}
	else
		return;
}

第三步:当小于设定文本长度时,直接返回系统的CEdit::OnChar

else
//说明现有的长度没有超过规定的长度
{		
	CEdit::OnChar(nChar , nRepCnt , nFlags);
}