mfc Fenster Handle abfangen
-
Hi
Ich habe ein Problem
ich habe eine Listbox oder ähnliches. Wenn ich jetzt da klicke, dann ist das aktuelle Fenster ja die Listbox. Ich möchte jetzt das ein Ereignis ausgelöst wird, sobald ich woanders klicke.
z.b. ich bin jetzt "aktiv" in der Listbox3. Jetzt klicke ich auf listbox2 oder listbox1 oder OkButton oder MyButton oder auf das Hauptdialogfenster möchte ich ein ereignis auslösen, durch einen einfachklick.
Was muss ich dazuadden?
-
KillFocus ist das Zauberwort.
-
Danke für das Zauberwort, aber ich müsste auch wissen wie ich es einsetze.
die listbox oder ähnliches heisst z.b. m_listbox von IDC_LIST
Jetzt muss ich ja in der MessageMap???? sowas einfügen??
ON_KILL_FOCUS(IDC_LIST, MyFkt)
So oder? und jetzt wenn ich nichtmehr den focus drauf habe wird die Fkt. MyFkt aufgerufen?
-
Sollte eigentlich, ja.
Ich mach das immer per Assistent, aber ich glaube so sieht das aus.Wieso? Geht es nicht?
-
eine frage habe ich,
wenn ich etwas überprüfen will indem man in die listbox tippt, wie mache ich das?
überlegung meinerseits ist
PreTranslateMessage(MSG* pMsg)
da überprüfen ob m_bOK true ist
dannif (pMsg->message == WM_KEYDOWN)
m_bOK wird aktiv beim ereignis EN_SETFOCUS und deaktiv bei EN_KILLFOCUS
meine fragen sind jetzt. brauch ich extra 2 zusätzliche Funktionen ( setfocus und killfocus ). wird die Funktion PreTranslateMessage(MSG* pMsg) aufgerufen wenn der focus auf ein listbox steuerelement ist?
Ich habe nur eine membervaribale CString der listbox hinzugefügt. jetzt kann ich ja schlecht m_listbox.isfocus oder so aufrufen, sondern du den string übermitteln.
-
warum bekomm ich einen StackOverflow und mein programm stürzt ab???????
.h
//{{AFX_VIRTUAL(CTest) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung public: virtual BOOL PreTranslateMessage(MSG* pMsg);
.cpp
BOOL CTest::PreTranslateMessage(MSG* pMsg) { return CTest::PreTranslateMessage(pMsg); //return true; // hier stürzt das programm nicht ab, nur wenn ich irgendwas anklicken will }
-
Hi,
du must PreTranslateMessage von der Basisklasse aufrufen, sonst gibts den
Stackoverflow.BOOL CTest::PreTranslateMessage(MSG* pMsg) <-- { | | = Endlosschleife auf den Stack | return CTest::PreTranslateMessage(pMsg);--------- // return CListBox::PreTranslateMessage(pMsg); //return true; // hier stürzt das programm nicht ab, nur wenn ich irgendwas anklicken will }
Gruss
EB
-
super
lol, auf das muss man einfach mal so kommen
ein
return CDialog.. // die basis
bewirkt wunder
danke danke
-
Naja, was heist "drauf kommen". Da du die Pretranslate funktion in deiner klasse überladen hast, wird nur noch diese aufgerufen. Wenn du nun aber auch die Funktionalität der "originalen" Pretranslate behalten willst, dann musst du diese aufrufen.
Das mit dem Stackoverflow ist ja auch klar. Wenn du eine Funktion aufrufst, wird platz auf dem Stack belegt und sobald du sie wieder verlässt wird dieser wieder freigegeben. Da deine Funktion sich nun ohne Abbruchbedingung immer wieder selbst aufgerufen hat, muss dieser ja irgendwann voll sein.
MfG
template