想要实现在输入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); }