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

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"?

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

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?

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

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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