使用MFC编辑控件中的块字符(仅用于浮动的示例)



我试图通过覆盖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);
  }
}

嗯,我的代码不工作。它可以编译,在编辑控件中输入时不会崩溃,但它根本不做任何事情。我想知道覆盖它的正确方法是否可以防止cdialgex::OnChar()的调用,或者如果我应该使nChar = 0以便显示的字符为空。但最重要的是,我试图在OnChar上显示的消息也没有显示,这意味着MyMainDialog::OnChar()甚至没有被调用。我应该覆盖cdialgex::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);
}

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

的输入。

我找到了解决方案。代码似乎没有在我的应用程序中产生任何影响的原因是因为它只对MyMainDialog产生影响。当在编辑控件中输入时,OnChar()被从CEdit调用,所以这是我必须拦截的。不允许覆盖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);
}

希望这对任何有类似问题的人有所帮助。顺便说一下,网上有很多课程和自动化的解决方案,我是为了学习而手工做的。

另一个解决方案是在PreTranslateMessage中更早地处理WM_CHAR

相关内容

  • 没有找到相关文章

最新更新