Die Methode OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) wir nicht angesprungen
-
Hi Leute,
ich mal wieder. Ich möchte jetzt abfragen, ob die Tab Taste gedrückt wurde. Hab mir gleich die Methode OnKeyDown herausgesucht. Leider wird diese Methode nicht angesprungen, wenn ich eine Taste drücke. Ich habe eine Dialog basierende Anwendung.
Wisst ihr, was ich falsch gemacht habe?
Danke schon mal.
Grüsse
xthing
-
Du hast ON_WM_KEYDOWN() in der MessageMap vergessen.
-
Forumsuche benutzen!!! Dann findest Du auch so etwas:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-172598.html
-
Ein Dialog empfängt Tastaturnachrichten in übersetzter Form, damit z.B. die Tabulatortaste wie gewohnt funktioniert. Es gibt aber mehrere Möglichkeiten, diesen Mechanismus zu umgehen. Man kann z.B. die Nachricht in der Nachrichtenschleife abfangen, bevor sie übersetzt wird: Überschreibe hierzu die Methode
PreTranslateMessagedes Dialogfeldes.
Gruß
Frdln
-
OnKeyDown() wird nicht angesprungen, da du bestimmt Buttons oder andere dinge im Dialog aktiv hast. Schalt die mal auf Deaktiviert und probiers nochmal. Hab auch gerade das Problem gehabt und gelöst mit PreTranslateMessage()
Guck mal hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-174406.html
-
Danke für die Hinweise mit PreTranslateMesssage. Habe ich bereits verwendet. Das Problem ist nur, dass, wenn ich diese Funktion verwende, die gesamte Anwendung blockiert ist. D. h. ich kann weder was eingeben, noch auswählen und schliessen der Anwendung funktioniert auch nicht mehr. Das Phänomen tritt auch auf, wenn ich keinen Code, ausser natürlich einem return, in der Methode habe. Vermutlich muss etwas mehr getan werden.
Weiss da einer einen Rat?
Danke noch mal.
Grüsse
xthing
-
hmm komisch bei mir kann ich wie gewohnt weiterarbeiten.
Rufst du denn beide, also OnKeyDown UND PreTranslateM. auf?
-
Ein einfaches return ist auch zu wenig in der PreTranslateMessage() - der Rückgabewert sagt dem System, ob du mit dieser Nachricht fertig bist, und wenn du für alles
return TRUE;zurückgibst, gelten ALLE Nachrichten als "bereits erledigt. Korrekt müsstest du die Funktion so aufbauen:BOOL PreTranslateMessage(MSG* msg) { if(msg->message==WM_KEYDOWN&&...) { //verarbeiten return TRUE; } else return FALSE;//zurück in die Nachrichtenschleife -> der Dialog kümmert sich darum }
-
Hi CStoll,
danke, jetzt klappt es.
Gruss
Ralf