Veröffentlicht 11. Oktober 200222 j 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
11. Oktober 200222 j 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.
24. September 200321 j 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"?
29. September 200321 j 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.
29. September 200321 j 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
29. September 200321 j 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.
29. September 200321 j 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
30. September 200321 j 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?
30. September 200321 j 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
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.