1

我有一个在中国和印度使用的应用程序。在一组 Cedit 控件中,我希望用户只能输入属于经典拉丁字母的字符(ISO8859-1 很好)。这些控件用于输入注册数据,因此汉字对我们没有用,因为我们无法阅读它们。

该应用程序是基于 MFC 的,使用 UNICODE 构建。
如何将这些 CEdit 限制为拉丁字符。可用字符是否取决于 CEdits 或该字体的 CharacterSet 中使用的字体?
目前,我很困惑,任何帮助、提示、提示、方向将不胜感激。

4

1 回答 1

0

这是我在我的程序中所做的:

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(' '));
    }
  }
}
于 2013-03-21T00:22:11.390 回答