Wann verlässt die Mouse mein Fenster?
-
Ich will eine Art Mouse-Hover-Effekt für meine Dialoge programmieren. Mit der OnNcHitTest()-Methode (WM_NCHITTEST) bekomme ich zwar mit, wann die Mouse mein Fenster betritt, aber wie kann ich das Gegenteil mitbekommen? Also wann die Mouse mein fenster verlässt?
-
Nur eine Idee - du könntest WM_MOUSEMOVE abfangen und dann die Position der Maus mit deinem Fensterbereich vergleichen.
-
Leider kommen die Mouse move events nur für mein Fenster. Wenn sich die Mouse außerhalb bewegt, bekomme ich die Events nicht und kann somit leider auch keinen Koordinatenvergelich machen.
-
Wenn du eine Katze installierst.
-
Hier könnte eventuell die SetCapture Funktion weiterhelfen!
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/mouseinputreference/mouseinputfunctions/setcapture.asp
-
Warum so kompliziert, es gibt doch für (fast) alles Messages ;).
Du musst nur bei ON_WM_MOUSEMOVE _TrackMouseEvent aufrufen und WM_MOUSELEAVE + WM_MOUSEHOVER bearbeiten:void CMyWnd::OnMouseMove(UINT nFlags, CPoint point) { TRACKMOUSEEVENT tme; tme.cbSize = sizeof(tme); tme.hwndTrack = m_hWnd; tme.dwFlags = TME_LEAVE|TME_HOVER; tme.dwHoverTime = 1; _TrackMouseEvent(&tme); CEdit::OnMouseMove(nFlags, point); } void CMyWnd::OnMouseHover(WPARAM wparam, LPARAM lparam) { // Code für Deine Aktion, wenn die Maus das Fenster trifft. } LRESULT CMyWnd::OnMouseLeave(WPARAM wparam, LPARAM lparam) { // Code für Deine Aktion, wenn die Maus das Fenster verläßt. return 0; }
Gruß T.
-
guenni81! Hem, das ist aber kein MFC?
CaptorChanged gibts zwar in der MFC, aber das reagiert auch nur auf Mouseclicks (nicht Mousemoves), das ein anderes Fenster erhält. Ich hab auch versucht ::SetCaption(*this) zu setzen, wenn ein Fenster NcTestHit bekommt, aber dann reagiert kein Fenster mehr auf Mouse-Inputs. Viel zu kompliziert.
-
gerade kein login schrieb:
Warum so kompliziert, es gibt doch für (fast) alles Messages ;).
Du musst nur bei ON_WM_MOUSEMOVE _TrackMouseEvent aufrufen und WM_MOUSELEAVE + WM_MOUSEHOVER bearbeiten:void CMyWnd::OnMouseMove(UINT nFlags, CPoint point) { TRACKMOUSEEVENT tme; tme.cbSize = sizeof(tme); tme.hwndTrack = m_hWnd; tme.dwFlags = TME_LEAVE|TME_HOVER; tme.dwHoverTime = 1; _TrackMouseEvent(&tme); CEdit::OnMouseMove(nFlags, point); } void CMyWnd::OnMouseHover(WPARAM wparam, LPARAM lparam) { // Code für Deine Aktion, wenn die Maus das Fenster trifft. } LRESULT CMyWnd::OnMouseLeave(WPARAM wparam, LPARAM lparam) { // Code für Deine Aktion, wenn die Maus das Fenster verläßt. return 0; }
Danke, sowas ähnliches habe ich gesucht! Nur woher soll der Tracker wissen, das er OnMouseLeave() aufrufen soll?
OnMouseLeave gibt es in CWnd ja leider nicht. Auch ein passendes Messagemap Macro habe ich nicht gefunden.
Ich hab es trotzdem ausprobiert, es ist aber nichts passiert...
-
Artchi schrieb:
guenni81! Hem, das ist aber kein MFC?
CaptorChanged gibts zwar in der MFC, aber das reagiert auch nur auf Mouseclicks (nicht Mousemoves), das ein anderes Fenster erhält. Ich hab auch versucht ::SetCaption(*this) zu setzen, wenn ein Fenster NcTestHit bekommt, aber dann reagiert kein Fenster mehr auf Mouse-Inputs. Viel zu kompliziert.
Mhh, müsste MFC sein, steht zumindest in meinem MFC Buch drin
-
Das in die *.h:
afx_msg void OnMouseHover(WPARAM wparam, LPARAM lparam) ; afx_msg LRESULT OnMouseLeave(WPARAM wparam, LPARAM lparam);
und das in die *.cpp Messagemap:
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
Gruß T.
-
gerade kein login schrieb:
und das in die *.cpp Messagemap:
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
Danke!!!
Genau das hat mir gefehlt und es funktioniert! Dann hab ich jetzt noch was dazu gelernt.