Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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...
Geschrieben

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.

Geschrieben
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

Geschrieben

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.

Geschrieben

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

Geschrieben
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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...