Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

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.

  • 11 Monate später...

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.

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

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.

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

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.