EN_KILLFOCUS & PreTranslateMessage
-
Oje, so wie beschrieben scheint es nicht zu funktionieren! WM_COMMAND wird nicht in PreTranslateMessage abgefangen ...
Wo bitte, wird denn diese Nachricht abgefangen???????
-
anon hat recht, PreTranslateMessage geht ja nur für Messages, die über die Message Loop gehen.
Warum bekomtm der Parent-Dialog keinen "normalen" Handler dafür, also
ON_EN_KILLFOCUS( <id>, <memberFxn> )
?
-
Du meinst wohl die Edit-Klasse selbst, ... oder hab ich da nun was nicht verstanden?
Ich kann leider die ON_EN_KILLFOCUS der Editklasse nicht verwenden. Warum? Nun paß auf, jetzt wirds nämlich toll! --> !!!!!
In meinem Dialog befindet sich ein CTreeCtrl und ein CEdit. Ich befinde mich mit dem Cursor im Edit (also CEdit hat den Fokus). Ich will in den Baum überwechseln (CEdit verliert den Foukus, CTreeCtrl bekommt den Focus und markiert das Item). Nun kommts aber --> CTreeCtrl::ON_TVN_SELCHANGED wird vor CEdit::EN_KILLFOCUS aufgerufen!!!!!!!!!
Völliger Unsinn der MFC, aber ist nun mal so. Mir bleibt nun nichts anderes übrig, als völlig losgelöst vom CTreeCtrl und vom CEdit die meldung EN_KILLFOUCS abzufangen ...
-
Nun kommts aber --> CTreeCtrl::ON_TVN_SELCHANGED wird vor CEdit::EN_KILLFOCUS aufgerufen!!!!!!!!!
Erstmal hat die MFC höchstwahrscheinlich nichts damit zu tun, sondern die WinAPI.
Du solltest mal lieber erklären warum es zu Problemen kommt bei dieser Nachrichtenreihenfolge.
-
heh
Sorry für den vielen Text - ich hoffe es lohnt sich.
(1) Ist sicherlich keine Sache der MFC, sondern vom Tree Control. Ist natürlich putzig...
(2) Nochmal recap:
Nein, ich meine im Parent-Dialog.
Windows-Controls senden bei bestimmten Ereignissen eine Message an ihren Parent (das ist normalerweise der Dialog). Für "alte Controls" (alles was es unter Win 3.* schon gab) ist es WM_COMMAND, für neue Controls (common controls/neu in Win9x) ist das WM_NOTIFY. Der Handler für das EN_KILLFOCUS liegt also im Dialog.MFC und ATL bieten eine sog. "Message Reflection", die es der Control-Klasse erlauben, seine eigenen Notifications selbst zu bearbeiten/filtern. Das sind aber andere Message Map Macros, und Funktionsprototypen (MSDN TN52 so aus dem Kopf...). Ist für "Self contained"-Control-Klassen gedacht, die ihre eigenen Events brauchen, der Parent-Dialog muß aber von MFC/ATL gesteuert sein.
(3) Nun endlich zu deinem Problem
Ich seh' das gleicher verhalten hier (kleine Dialoganwendung + spy). Der LButtonDown-Handler des Treecontrols scheint SetFocus erst sehr spät aufzurufen. Naja, ich fand das Tree View Control eh' schon imemr das am schlampigsten implementierte Window Control.
Heißt aber: Du wirst das Das TVN_SelChanging *immer* vor dem KillFocus bekommen, weil der Fokuswechsel erst später ausgelöst wird. (gibt wahrscheinlich sogar einen guten Grund dafür) - es sei denn das Verhalten ist mit verschiedenen Common Controls - Versionen unterschiedlich (glaub ich aber eher weniger).
Nun ist die nächste Frage natürlich: Wo ist das eigentliche Problem?
Was soll der TVN_SELCHANGING und der KillFocus-Handler machen, und warum kommen die sich in die Quere?
-
Vielen Dank für die ausführliche Beschreibung der allgemeinen Sachlage. Warum sich TreeCtrl und Edit in die Quere kommen liegt daran, daß ich jedesmal, wenn das Item im Baum gewechselt wird, ich den Inhalt des Edits abspeichern will. (die Umstände sind im Speziellen noch etwas schwieriger, weil noch ein zweites TreeCtrl existiert, bei dem ein Abspeichern des Editinhaltes vermieden werden muß.
-
Merk' dir doch den HTREEITEM/ItemID, für den Du das Edit bestückst, un bei EN_KillFocus sicherst du das Edit für die diesen item. Dann bist Du unabhängig von der Reihenfolge.
-
Das geht wohl kaum! Denn Das Edit ist Unterelement des Dialoges. Wie soll ich auf Member dieses Dialoges zugreifen können?
-
Wie oben schon gesagt, bekommst du die EN_KILLFOCUS - Notification im Dialog und könntest von dort das Speichern anstoßen.
oder du mußt dem Edit das "Speicherziel" mitgeben (weiß ja nicht ob Datei oder...)
-
Ja, aber wo bekomme ich diese Notification? In PreTranslateMessage ja leider nicht ...
Wie kann ich dieses EN_KILLFOCUS denn abfangen????
-
(a) mit dem Wizard: Rechtsklick auf Klasse, "Add message Handler...", rechts unten das Edit auswählen, links EN_KILLFOCUS, dann "Add and Edit" klicken
(gibnt auch noch zwei andere WegeWizard Bar und Klassenassistent)
Was dabei passiert: deklaration + (leere) Implementation der Handler-Funktion wird zur Klasse hinzugefügt und ein eintrag in die Message Mao vorgenommen
-
Ich dachte, es ich müßte die Message in der Parentklasse, also im Dialog abfangen? Wo geht das denn bitte - in PreTranslateMessage gehts ja nicht (in WinProc???) - kann ich EN_KILLFOCUS abfangen?
-
Nein ... DANKE, es funktioniert!!!