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.





  • 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. 🙂


Anmelden zum Antworten