Validierung von Edit-Control
-
Hallo zusammen,
wieder mal eine Frage von mir:
Ich hab in meinem Projekt eine Toolbar, mit welcher ich einen Zoom-Wert einstellen kann. Das ganze geschieht entweder über ein Slider-Control was soweit funktioniert oder über eine Edit-Box in die der Benutzer den Wert händisch oder über ein Spin-Control eingeben kann.
Damit ihr euch das besser vorstellen könnt hab ich einen kleinen Screenshot gemacht.
Nun das Problem:
Ich weiß nicht, wie (bzw. wo) ich die Eingabe des Benutzer in das Edit-Control validieren kann, dh. die Eingabe soll übernommen werden, sobald der Benutzer entweder Enter drückt oder mit der Maus auf irgend einen Bereich außerhalb des Edit-Controls klickt.
Hab mittlerweile eine eigene Klasse von CEdit abgeleitet und reagiere in der WindowProc auf WM_KEY_DOWN und WM_CHAR vorerst mit einem TRACE(...).
Leider wird das TRACE bei allen Tasten außer der Enter-Taste ausgegeben
, dh. die Enter-Taste kann ich so auch nicht abfangen...
Woran liegt das und wie kann ich das umgehen?Welche Window-Message könnte ich abfangen, damit ich auf den Mausklick auf irgendeinen anderen Bereich als die Edit-Feld reagiere? WM_CAPTURE_CHANGED oder WM_KILLFOCUS erzeugen leider nicht das gewünschte verhalten. WM_KILLFOCUS kommt zB. nur, wenn ich etwa auf eine geöffnete View drücke, nicht jedoch, wenn ich auf einen anderen Bereich in meiner Toolbar klicke...
Hoffe das mir jemand helfen kann!
danke, mfg
-
WM_KILLFOCUS; EN_KILLFOCUS ist korrekt.
Ansonten ist ja auch korrekt, denn der Focus ändert sich nicht, wenn Du ene andere Applikation aktivierst. Innerhalb Deiner Applikation behält das Feld den Focus.Ansonsten kannst Du einen Mouse-Hook installieren (SetWindowsHookEx,WH_MOUSE) und einfach bei einem Mouse-Click den Focus aus Deinem Edit Control wegsetzten, das löst wieder einfach den bestehnden Handler aus, der reagiert wenn ein normaler Fokus Verlust auftritt.
-
Hm, mir geht es nicht darum, dass der Fokus erhalten bleibt, wenn ich auf eine andere Anwendung klicke, sondern wenn ich auf einen Bereich innerhalb der Anwendung klicke.
Zur Veranschaulichung dieser Screenshot.
Die Validierung soll immer durchgeführt werden, wenn ich auf irgend einen Bereich außerhalb des rot markierten Bereichs klicke. Also zB. auf den Log-Button oder einen leeren Bereich der Toolbar bzw. des Programm-Menüs. WM_KILLFOCUS kommt da nicht an.
WM_KILLFOCUS kommt zB. erst an, wenn ich mit der Maus auf den weißen Bereich unterhalb der Toolbar klicke (also die View). Erst dann geht auch die blaue Markierung (eben für den Fokus) verloren.
Wenn ich es mir genau überlege ist das ja eigentlich das Standard-Fokus-Verhalten von Windows, also sollte ich das eher so lassen....
Ok, der Punkt wäre damit wohl abgehakt, jetzt bleibt nur noch die Frage nach der Validierung über die Enter-Taste und warum WM_KEYDOWN bzw. WM_CHAR bei Betätigung dieser nicht ankommt?
-
Ich habe nicht geschrieben, dass damit der Fokus erhalten bleibt.
Und ich habe Dich verstanden. Das gleiche Problem hat man bei Inplace Edit-Controls die aufpoppen über einem Listctrl etc...Ich benutzte Grundsätzlich einfach diese Funktion, denn ich muss sie sowieso implementieren.
Zusätzlich baruchst Du einen Hook, für die Mausaktivitätät. Im Hook machst Du einfach ein SetFocus auf Dein Hauptfenster. WM_KILLFOCUS wird gesendet und das löst Deine Validierung aus.
Es ist einfacher alles Zentral in einem Handler zu machen und ein Killfokus Handler ist dazu eben geeignet.
Die Eingabetaste wird nicht ankommen, weil das ganze vermutlich in einem CDialogBar drin sitzt. Hier schlägt IsDialogMessage zu und beantsprucht die Enter Taste für sich.
-
Martin Richter schrieb:
Ich habe nicht geschrieben, dass damit der Fokus erhalten bleibt.
Und ich habe Dich verstanden. Das gleiche Problem hat man bei Inplace Edit-Controls die aufpoppen über einem Listctrl etc...Ok, dann hab ich dich wohl missverstanden...
Martin Richter schrieb:
Die Eingabetaste wird nicht ankommen, weil das ganze vermutlich in einem CDialogBar drin sitzt. Hier schlägt IsDialogMessage zu und beantsprucht die Enter Taste für sich.
Jep, ist ein CDialogBar. Gibt es dort dann keine Möglichkeit die Enter-Taste abzufangen? Kann/will ich mir irgendwie nicht vorstellen. Hab übrigens auch schon versucht einen OK-Button auf die Toolbar (bzw. halt DialogBar) zu legen weil ich eben dachte, dass die Standardmäßig dann eben das Enter abfängt. Leider war der Button immer deaktiviert, obwohl ich das OnOK korrekt implementiert hatte...
Btw. hab ich mich mittlerweile für eine andere Lösung entschieden:
Im OnEnChange des Edit-Controls setze ich jetzt einen Timer mit 700 ms. Nach Ablauf dieser Zeit wird der Timer gelöscht und die Validierung durchgeführt (Prüfen des Wertebereichs, aktualisieren des Sliders und der View).
Das Verhalten ist jetzt eigentlich ziemlich genau so, wie ich mir das vorstelle, also bin ich soweit ganz zufrieden mit der Lösung (obwohl sie wohl eher weniger Standard-Konform ist)...
danke, mfg
-
Eingabe-Taste und Dialog ist ein immerwährendes Thema das breit in der FAQ diskutiert wird

Siehe VK_ENTER und PreTranslateMessage...