Блокировка символов в Edit Control с использованием MFC (пример только для чисел с плавающей точкой) - PullRequest
2 голосов
/ 08 декабря 2011

Я пытаюсь заблокировать вставку определенных типов символов в свой элемент управления редактированием, перезаписывая OnChar и OnKeydown.Я пытаюсь заблокировать более одной точки ».и все, что не является числом.

Сначала я проверяю, есть ли уже "."в элементе управления Edit, который имеет фокус, установив для переменной, определенной в классе диалога, значение 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 я проверяю вводимый символ.Если это не число, если это точка, но точка уже была, то я не вызываю OnChar с CDialog:

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 ()?

Спасибо за ваше внимание

Ответы [ 3 ]

2 голосов
/ 09 декабря 2011

Гораздо более простой способ - обработать ваш ввод с помощью события 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);
}

Это не позволит номеров. С помощью этой реализации вы можете легче обрабатывать ввод в поле ввода

2 голосов
/ 11 мая 2012

Я нашел решение.Причина, по которой код, похоже, не оказывает никакого влияния на мое приложение, заключается в том, что он влияет только на MyMainDialog.При вводе в Edit Control, 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);
}

Надеюсь, это поможет любому с подобным вопросом.Кстати, в интернете есть много классов и автоматизированных решений, я делал это вручную в целях обучения.

1 голос
/ 08 декабря 2011

Другое решение заключается в обработке WM_CHAR ранее, в PreTranslateMessage .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...