Domanda

Sto cercando di bloccare determinati tipi di personaggi dall'inserimento del mio controllo di modifica sovraccaricando OnChar e OnkeyDown. Sto cercando di bloccare più di un punto "." E tutto ciò che non è un numero.

Per prima cosa controllo se c'è già un ''. Nel controllo di modifica che ha il focus impostando una variabile definita nella classe di dialogo su 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);
}

In OnChar sto controllando il personaggio da digitare. Se non è un certo numero se è un punto ma c'era già un punto, allora non chiamo l'onchar da 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);
  }
}

Bene, il mio codice non funziona. Compila e non si schianta durante la digitazione nel controllo di modifica, ma semplicemente non fa nulla. Mi chiedo se il modo giusto per sovrascrivere sarebbe quello di prevenire la chiamata di Cdialogex :: Onchar () o se dovrei fare nchar = 0 in modo che il carattere visualizzato sia nullo. Ma inoltre il messaggio che sto cercando di visualizzare su Onchar non è anche visualizzato, il che significa che MyMainDialog :: Onchar () non viene nemmeno chiamato. Dovrei sovrascrivere CDIALOGEX :: ONCHAR () invece?

Grazie per l'attenzione

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top