Scratch Geschrieben 11. Oktober 2002 Geschrieben 11. Oktober 2002 Hi, ich möchte ein Textfeld machen in dem man nur 0 und 1 eingeben kann, das selbe nochmal für 0 - F (Hex). thx für jede Hilfe Zitieren
Klotzkopp Geschrieben 11. Oktober 2002 Geschrieben 11. Oktober 2002 Die "schöne" Methode wäre, eine Klasse von CEdit abzuleiten, darin WM_CHAR zu behandeln, und nur dann CEdit::OnChar aufzurufen, wenn es sich um ein gültiges Zeichen handelt. Es geht aber auch einfacher. Überschreibe die Methode PreTranslateMessage Deines Dialogs mit Hilfe des Klassenassistenten. Darin kannst Du Tasten-Nachrichten an das Eingabefeld abfangen: #define ALLOWED_CHARS "01\x8" BOOL CDeinDlg::PreTranslateMessage(MSG* pMsg) { if( pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP ) { if( pMsg->hwnd == GetDlgItem( IDC_DEIN_EDIT )->m_hWnd ) { if( NULL == strchr( ALLOWED_CHARS, pMsg->wParam ) ) { return TRUE; } } } return CDialog::PreTranslateMessage(pMsg); }[/CODE] Im Klartext: Wenn es sich um eine Tasten-Nachricht handelt, die an Dein Eingabefeld geht, und bei der das Zeichen nicht in ALLOWED_CHARS enthalten ist, dann wird die Nachricht einfach verworfen. Das \x8 in ALLOWED_CHARS ist übrigens die Rückschritt-Taste. Zitieren
Scratch Geschrieben 11. Oktober 2002 Autor Geschrieben 11. Oktober 2002 Mal wieder dickes Dankeschön fürs helfen ! Zitieren
Narf! Geschrieben 24. September 2003 Geschrieben 24. September 2003 Wie kann ich damit feststellen, ob die Enter-Taste gedrückt wurde und wenn ich die Enter-Taste bei #define mit angeben muss, ist es dann "\x13"? Zitieren
Narf! Geschrieben 29. September 2003 Geschrieben 29. September 2003 Bei mir sieht es jetzt so aus: #define ALLOWED_CHARS "0123456789\x8\x13" kommt nach den includes. BOOL CTest2Dlg::PreTranslateMessage(MSG* pMsg) { //Für die Menü-Tastenkürzel if(pMsg->message>=WM_KEYFIRST && pMsg->message<=WM_KEYLAST) { return ::TranslateAccelerator(m_hWnd,(HACCEL__ *)m_hAccel, pMsg); } //Für das Eingabefeld if(pMsg->message==WM_KEYDOWN || pMsg->message==WM_KEYUP) { if(pMsg->hwnd==GetDlgItem(IDC_EDIT1_Page)->m_hWnd) { if(NULL==strchr(ALLOWED_CHARS, pMsg->wParam)) { return TRUE; } //Ist Enter gedrückt worden? if(pMsg->wParam=='\x13') MessageBox("Hallo",""); } } return CDialog::PreTranslateMessage(pMsg); } Es passiert nichts. Ich habe es auch mit Haltepunkten getestet, aber er hält nicht bei WM_KEYDOWN an. Es kann also keine Abfrage der Eingabe erfolgen. Zitieren
Goos Geschrieben 29. September 2003 Geschrieben 29. September 2003 Original geschrieben von Narf! Bei mir sieht es jetzt so aus: //Ist Enter gedrückt worden? if(pMsg->wParam=='\x13') MessageBox("Hallo",""); Es passiert nichts. Ich habe es auch mit Haltepunkten getestet, aber er hält nicht bei WM_KEYDOWN an. Es kann also keine Abfrage der Eingabe erfolgen. Um was gehts dir jetzt? Fuer die Enter Taste reichen doch die zwei Zeilen da. Funktionieren tut das nicht, weil du nen Hex Wert 13 nimmst. Richtig waere aber da dann 0x0D oder halt 13 dezimal. Funktionieren wuerde also if(pMsg->wParam=='\x0D')(hex) , if(pMsg->wParam=='\15') (octal), if(pMsg->wParam==13) (dezimal), if(pMsg->wParam==0x0D) (hex) Goos Zitieren
Narf! Geschrieben 29. September 2003 Geschrieben 29. September 2003 Es sollen nur Zahlen eingegeben werden und wenn die Entertaste gedrückt wurde, soll der Inhalt des Eingabefeldes zur weiteren Verarbeitung ausgelesen werden. Und die Entertaste interessiert mich nur bei diesem Eingabefeld und wie schon oben geschrieben, die Nachricht WM_KEYDOWN wird nicht angesprochen. Zitieren
Goos Geschrieben 29. September 2003 Geschrieben 29. September 2003 Is schon klar, dass du dort nicht hinkommst. Du springst ja schon vorher raus. Man koennte sich ja schon vom Namen her denken, dass WM_KEYDOWN wohl zwischen WM_KEYFIRST und WM_KEYLAST liegt Goos Zitieren
Narf! Geschrieben 30. September 2003 Geschrieben 30. September 2003 Das hilft mir jetzt nicht weiter. Bei WM_KEYFIRST, WM_KEYLAST gibt es den Accelerator zurück. Wie kriege ich die Tasten im Eingabefeld abgefragt? Zitieren
Goos Geschrieben 30. September 2003 Geschrieben 30. September 2003 Original geschrieben von Narf! Das hilft mir jetzt nicht weiter. Bei WM_KEYFIRST, WM_KEYLAST gibt es den Accelerator zurück. Wie kriege ich die Tasten im Eingabefeld abgefragt? Du gibst ZWISCHEN WM_KEYFIRST und WM_KEYLAST deinen Accelerator zurueck. Durch dieses return ists doch klar, dass du zu deinen Tastenabfragen nicht mehr kommst, da WM_KEYDOWN auch zwischen WM_KEYFIRST und WM_KEYLAST liegt. Du solltest also mal den Code umstellen und zuerst deine Tastenabfragen machen. Goos Zitieren
Narf! Geschrieben 1. Oktober 2003 Geschrieben 1. Oktober 2003 Habe ich umgestellt, jetzt funktioniert es. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.