2

我试图通过覆盖 OnChar 和 OnKeydown 来阻止某些类型的字符插入到我的编辑控件中。我试图阻止不止一点'。以及任何不是数字的东西。

首先我检查是否已经有一个“。” 通过将对话框类中定义的变量设置为 false,在具有焦点的编辑控件中:

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 以便显示的字符为空。但最重要的是,我试图在 OnChar 上显示的消息也没有显示,这意味着 MyMainDialog::OnChar() 甚至没有被调用。我应该改写 CDialogEx::OnChar() 吗?

感谢您的关注

4

3 回答 3

2

更简单的方法是使用 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);
}

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

于 2011-12-09T10:05:51.427 回答
2

我找到了解决方案。代码似乎对我的应用程序没有任何影响的原因是因为它只对 MyMainDialog 有效。在编辑控件中键入时,如果从 CEdit 调用 OnChar(),那么这是我必须拦截的。不允许覆盖 CEdit::OnChar()。解决方案是创建一个派生自 CEdit 的类,然后从该类中截取 OnChar()。您还必须使用您的类而不是 CEdit 来操作您的编辑控件。

然后我的代码被重新制定为:

OnChar():

void CustomEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
  if(nChar == '.' && checkPoint == true) //Is a point and there is already a point
  {
     //Show message  
  }
  else if(nChar == '.' && checkPoint == false) //Is a point but there is no point
  {
    CEdit::OnChar(nChar, nRepCnt, nFlags);
  }

  if((nChar < '0' || nChar > '9') && nChar != 8) //Is not a number or backspace
  {
     //Show message
  }
  else //Valid
  {
     CEdit::OnChar(nChar, nRepCnt, nFlags);
  }
}

OnKeyDown():

void CustomEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
  CString temp;

  this->GetWindowTextA(temp);
  if(temp.Find('.') == -1)
    checkPoint = false; //There is no point
  else
    checkPoint = true; //There is a point

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

希望这可以帮助任何有类似问题的人。顺便说一句,互联网上有很多课程和自动化解决方案,我出于学习目的手动完成了这个。

于 2012-05-11T06:24:39.223 回答
1

另一种解决方案是在PreTranslateMessageWM_CHAR中更早地处理。

于 2011-12-08T13:02:20.937 回答