我有一个在中国和印度使用的应用程序。在一组 Cedit 控件中,我希望用户只能输入属于经典拉丁字母的字符(ISO8859-1 很好)。这些控件用于输入注册数据,因此汉字对我们没有用,因为我们无法阅读它们。
该应用程序是基于 MFC 的,使用 UNICODE 构建。
如何将这些 CEdit 限制为拉丁字符。可用字符是否取决于 CEdits 或该字体的 CharacterSet 中使用的字体?
目前,我很困惑,任何帮助、提示、提示、方向将不胜感激。
我有一个在中国和印度使用的应用程序。在一组 Cedit 控件中,我希望用户只能输入属于经典拉丁字母的字符(ISO8859-1 很好)。这些控件用于输入注册数据,因此汉字对我们没有用,因为我们无法阅读它们。
该应用程序是基于 MFC 的,使用 UNICODE 构建。
如何将这些 CEdit 限制为拉丁字符。可用字符是否取决于 CEdits 或该字体的 CharacterSet 中使用的字体?
目前,我很困惑,任何帮助、提示、提示、方向将不胜感激。
这是我在我的程序中所做的:
void CRequestForm::OnEnChangeEditDetail()
{
// Filter out the clinical note of any invalid characters as the user types.
CString strNotes;
m_edit.GetWindowText(strNotes);
BOOL bValid = TRUE;
int nStartChar, nEndChar;
CString strTyped;
m_edit.GetSel(nStartChar, nEndChar);
if(strNotes.GetLength() - m_strOldNote.GetLength() == 1)
{
// this is normal user typing
CString strInvalidChars;
if(nStartChar == nEndChar && nStartChar > 0)
strTyped = strNotes.Mid(nStartChar-1, 1);
if(!CheckInvalidCharacters(strTyped))
{
m_edit.SetWindowText(m_strOldNote);
if(nStartChar > 0 && nEndChar > 0)
m_edit.SetSel(nStartChar-1, nEndChar-1);
else
m_edit.SetSel(nStartChar, nEndChar);
bValid = FALSE;
}
}
else if(strNotes.GetLength() - m_strOldNote.GetLength() == 2 &&
nStartChar == nEndChar && nStartChar > 0 &&
strNotes.Mid(nStartChar-2, 2) == _T("\r\n"))
{
// Allow CrLf
bValid = TRUE;
}
else
{
// this is most likely the case of "Pasted" text. need just to remove invalid characters
RemoveInvalidChars(strNotes);
}
if(bValid)
{
m_strOldNote = strNotes;
m_edit.SetWindowText(strNotes);
m_edit.SetSel(nStartChar, nEndChar);
}
}
如您所见,您需要有一个m_strOldNote
使用初始文本(在 OnInitDialog 中)启动的实例变量。在您的 m_edit 中,您需要处理 EN_CHANGE 事件。
您将需要两个功能:这可能很简单CheckInvalidCharacters()
:RemoveInvalidChars()
BOOL CRequestForm::CheckInvalidCharacters(const CString& strText)
{
BOOL bResult = TRUE;
int nPos, nLenght;
nLenght = strText.GetLength();
for(nPos = 0; nPos < nLenght; ++nPos)
{
TCHAR ch = strText.GetAt(nPos);
if(!(ch >= '0' && ch <= '9') &&
!(ch >= 'A' && ch <= 'Z') &&
!(ch >= 'a' && ch <= 'z') &&
!(ch >= 32 && ch <= 64 && ch != '&') && // Space thru @, excluding |^~\&
!(ch == '[' || ch == ']' || ch == '{' || ch == '}' || ch == '_' || ch == '\r' || ch == '\n'))
{
bResult = FALSE;
}
}
return bResult;
}
void CRequestForm::RemoveInvalidChars(CString &str)
{
// remove non-ASCII characters
int nPos, nLenght;
nLenght = str.GetLength();
for(nPos = 0; nPos < nLenght; ++nPos)
{
TCHAR ch = str.GetAt(nPos);
if(!((ch >= _T('0') && ch <= _T('9')) ||
(ch >= _T('A') && ch <= _T('Z')) ||
(ch >= _T('a') && ch <= _T('z')) ||
(ch >= 32 && ch <= 64 && ch != _T('&')) || // Space thru @, excluding |^~\&
ch == _T('[') || ch == _T(']') || ch == _T('{') || ch == _T('}') || ch == _T('_')))
{
str.SetAt(nPos, _T(' '));
}
}
}