OnMouseWheel: Ist Maus im Fenster?



  • Tag,

    Ich habe hier folgenden Code, der erreichen soll, dass ich innerhalb meines GLUT-Fensters rein- bzw. rauszoomen kann:

    BOOL COpenGLView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
    {
    	if (/*????*/)
    	{
    		m_zoom += (GLfloat) zDelta/120;
    		LookAtScene();
    		RenderScene();
    	}
    
    	return __super::OnMouseWheel(nFlags, zDelta, pt);
    }
    

    Ich würde nun gerne hinzufügen, dass ich nur zoomen möchte, wenn der Mauszeiger innerhalb meines GLUT-Fensters ist. Wie sollte ich darum diese if-Bedingung formulieren? Kann ich dass über pt erreichen, in dem ich überprüfe, wo sich die Maus gerade befindet, oder geht das einfacher?

    H.W.


  • Mod

    Du bekommst diese WM_MOUSEWHEEL nur wenn das Fenster den Focus/Capture oder eben wenn der Mauszeiger über Deiner Applikation ist.

    pt sind die relativen Screen Koordinaten.

    Also um ganz sicher zu gehen:

    CRect rect;
    GetClientRect(rect);
    if (rect.PtInRect(pt))
    {
    ...
    


  • Hallo Martin,

    danke für die Antwort, aber da scheint etwas nicht zu stimmen.

    1.) Ich bekomme diese WM_MOUSEWHEEL auch, wenn ich ausserhalb meines Childfestern bin, ja sogar, wenn ich ausserhalb des Parentfensters bin.

    2.) Benutze ich den von dir vorgeschlagenen Code, dann bekomme ich WM_MOUSEWHEEL gar nicht mehr.

    BOOL COpenGL_MDIView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
    {
    	CRect rect;
    	GetClientRect(rect);
    
    	if (rect.PtInRect(pt))
    	{ 
    		m_zoom += (GLfloat) zDelta/120;
    		if (m_zoom < 0.0f) m_zoom = 0.0f;
    
    		LookAtScene();
    		RenderScene();
    	}
    
    	return __super::OnMouseWheel(nFlags, zDelta, pt);
    }
    

    Woran liegt das jetzt?
    H.W.


  • Mod

    Schon mal daran gedacht pt zu kontrollieren?
    Liegt er denn im rect?

    Ansonsten besorge Dir die abosolte Fensterposition mit GetMessagePos, diese mit ScreenToClient umwandeln, dann den selben Test.



  • HI.

    noch eine Frage. In der MSDN steht:

    The GetMessagePos function retrieves the cursor position for the last message retrieved by the GetMessage function.

    Du aber schreibst:

    besorge Dir die abosolte Fensterposition mit GetMessagePos

    Widerspricht sich das nicht? Du schreibst vom Fenster, in der MSDN aber gehts um die Cursorposition.

    H.W.

    P.S.:GetMessagePos() und pt haben die selben Koordinaten, die absolute Cursorposition auf dem Monitor.


Anmelden zum Antworten