我试图通过覆盖OnChar和OnKeydown阻止某些类型的字符插入到我的编辑控件中。我试图阻止多个点“。”还有不是数字的任何东西。

首先,我检查是否已经有一个'。通过将对话框类中定义的变量设置为false,可以在具有焦点的Edit控件中进行操作:

void MyMainDialog::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
  CWnd * eb1 = GetDlgItem(IDC_EDIT1); //Reference dimension 1 box;
  CWnd * eb2 = GetDlgItem(IDC_EDIT2); //Reference dimension 2 box
  CWnd * eb3 = GetDlgItem(IDC_EDIT3); //Reference dimension 3 box
  CString temp;

  CWnd * focusedHand = MyMainDialog::GetFocus(); //Reference edit box being focused

  if(focusedHand == eb1)
  {
    eb1->GetWindowTextA(temp);
    if(temp.Find('.') != -1)
      checkPoint = true;
    else
      checkPoint = false;
  }
  else if(focusedHand == eb2)
  {
    eb2->GetWindowTextA(temp);
    if(temp.Find('.') != -1)
      checkPoint = true;
    else
      checkPoint = false;
  }
  else if(focusedHand == eb3)
  {
    eb3->GetWindowTextA(temp);
    if(temp.Find('.') != -1)
      checkPoint = true;
    else
      checkPoint = false;
  }

  CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags);
}

在OnChar,我正在检查要键入的字符。如果不是很多点,但已经有一点,那么我就不会从CDialog调用OnChar:
void MyMainDialog::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
   if(nChar == '.' && checkPoint == false) //Is a point and there is no other point
  {
     CDialogEx::OnChar(nChar, nRepCnt, nFlags);
  }

  if((nChar < '0' || nChar > '9')) //Is not a number
  {
     //Show message to user
  }
  else //Is a number
  {
    CDialogEx::OnChar(nChar, nRepCnt, nFlags);
  }
}

好吧,我的代码无法正常工作。它可以编译,并且在输入编辑控件时不会崩溃,但是它根本不执行任何操作。我想知道覆盖它的正确方法是防止调用CDialogEx::OnChar()还是让nChar = 0以使显示的字符为null。但是最重​​要的是,我试图在OnChar上显示的消息也没有显示,这意味着MyMainDialog::OnChar()甚至没有被调用。我应该改写CDialogEx::OnChar()吗?

感谢您的关注

最佳答案

一种更简单的方法是使用OnChange事件处理您的输入:

// do not add numbers; ascci numbers is 48 - 57
if ((m_strYOURCONTROL[m_strYOURCONTROL.GetLength() - 1]) > 47 &&
         m_strYOURCONTROL[m_strYOURCONTROL.GetLength() - 1]) < 58)
{
    m_strYOURCONTROL = m_strYOURCONTROL.Mid(0, m_strYOURCONTROL.GetLength() - 1);
}

这将不允许数字。通过此实现,您可以更轻松地处理对编辑框的输入

08-27 02:29