Windowsnachrichten und Tastatureingaben



  • Mein Problem äussert sich in der Nachrichtenverwaltung von Windows. In einem Programm, das ich z.Z. schreibe, taucht ein Fehler auf, wenn ich in einem modalen Dialogfenster eine Eingabe vornehme (beispielsweise in einer Combo Box oder einem Bearbeitungsfeld) und ich (um Zeit zu sparen) nicht auf "Übernehmen" oder "OK" klicke, sondern einfach die ENTER-Taste drücke. Darauf hängt sich mein Programm auf, da in dem Dialogfeld ein Multiplikator für ein Array initialisiert und übergeben wird, dieser aber 0xCC (statt 0-10) beträgt. Ich habe daraufhin mein Programm untersucht und habe erfahren, dass die Funktion für das Übernehmen und interprtieren der Werte nicht aktiviert wird (wenn ich auf übernehmen klicke, läuft es jedoch wie geschmiert). Muss ich eine Extra-Nachrichtenbehandlung für die Ereignisse WM_KEYDOWN und WM_KEYUP erstellen, oder vielleicht nur den Fokus verschieben?

    Dann noch eine kurze Frage: Weiss jemand, was der _w-Typ (oder was immer es ist) in der Definition von INT_PTR bewirkt? Meine Dokumentation schweigt sich dazu aus.

    Vielen Dank im voraus.



  • Also wenn dein OK-Button die Standard-Schaltfläche ist, sollte ein Drücken auf die Enter-Taste genau diesen Eventhandler auslösen (wenn nicht grad ein anderer Button den Fokus hat). Was also mit Mausklick klappt, sollte genau so auch mit Enter passieren. Setz doch mal einen Breakpoint und überprüfe es genau.



  • Ich schilderer dir mal mein Vorgehen:

    Ich öffne das Projekt, verändere ein bisschen Code, der mir noch nicht gefällt, dann komiliere und starte ich das Programm. Hauptfenster erscheint, ich klicke auf den gewünschten Button, das zweite, modale Fenster erscheint. Dies besteht eigentlich nur aus einer Combo Box und zwei Buttons, einer für's Übernehmen der geänderte Wertes, einer für's verlassen des Dialogs ohne Sicherung. Zu Anfang hat die Combo Box den Fokus. Ich gebe schnell einen passenden Eintrag ein (ich bin noch mitten in der Programmier&Test-Phase, weshalb mir nicht viel Zeit bleibt) und drücke, nachdem die dafür zuständige Funktion meinen Eintrag als korrekt erkennt hat, einfach die ENTER-Taste. Ich glaube aber, dass eine Standartfunktion aufgerufen wird, die das Ereignis "Der Benutzer hat die ENTER-Taste gedrückt, obwohl der Fokus noch in der Combo Box war. Deshalb sollte der Dialog beendet werden, ohne die Eingabe zu analysieren und einen entsprechenden Wert zuzuweisen, wodurch der Multiplikator für ein 1.000.000-Bytes großes Array ausgerichtet wird und nicht für nur 10.000 Bytes." behandelt. Ich hätte gerne gewusst, wie man diese Funktion überlädt, da ich den Namen der Nachricht nicht kenne und auch mein Ereignishandler keine passende Funktion bereit hält.

    Einfach eine Control-Variable zu erzeugen, diese mit meinem "Übernehmen"-Button verbinden und SetFocus() aufzurufen bringt es nicht, da ich nicht weiss, welches Ereignis ausgelösst wird, wenn ich ENTER in der Combo Box drücke. Wenn du weisst, was ich man soll, wäre ich dir sehr dankbar, ehrlich.



  • Wenn auf einem Dialog in einer ComoBox "enter" gedrückt wird dann wird wie von _matze schon geschrieben die "OnOK" ausgelöst.

    D.h. entweder Du erledigst Deine Sache in der "OnOK" des Dialogs oder in der "KillFocus" der ComboBox.



  • Natürlich! OnOk() überschreiben! Da hat mir wohl das Hirn stillgestanden. Danke!

    Dazu eine kleine Berichtigung: Ich verwende so gut wie nie die IDOK, da ich selbstdefinierte IDs und Handler bevorzuge (gibt einem mehr Kontrolle über das Programm). Deshalb habe ich eine ID IDC_APPLY definiert und einen eigenen Handler zur Nachrichtenbehandlung geschrieben, der aber, wenn man ENTER drückt, nicht die Funktion OnApply(), sondern OnOK() durchführt. Wie dem auch sei, nochmals vielen Dank.


Anmelden zum Antworten