Get MouseLeave event while mouse button is pressed

Just starting out? Need help? Post your questions and find answers here.
User avatar
Michael Vogel
Addict
Addict
Posts: 2799
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Get MouseLeave event while mouse button is pressed

Post by Michael Vogel »

Is there a simple way to get an event triggered when leaving the canvas area even when the mouse button is pressed? Using a full callback routine should work but then I've to fetch the mouse and gadget coordinates, take the dpi scaling into account, etc.

Code: Select all

Procedure test()
	Debug "*OUT*"
EndProcedure

If OpenWindow(0, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	CanvasGadget(0, 10, 10, 200, 200); ,#PB_Canvas_ClipMouse
	
	BindEvent(#PB_Event_Gadget,@test(),0,0,#PB_EventType_MouseLeave)
	Repeat
		Event = WaitWindowEvent()

		If Event = #PB_Event_Gadget And EventGadget() = 0
			Select EventType()
			Case #PB_EventType_MouseLeave
				Debug "OUT"
			Case #PB_EventType_MouseEnter
				Debug "IN"
			Case #PB_EventType_LeftButtonDown,#PB_EventType_MouseMove
				If GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton

					If StartDrawing(CanvasOutput(0))
						x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
						y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
						Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
						StopDrawing()
					EndIf
				EndIf
			EndSelect
		EndIf

	Until Event = #PB_Event_CloseWindow
EndIf
User avatar
mk-soft
Always Here
Always Here
Posts: 6224
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Get MouseLeave event while mouse button is pressed

Post by mk-soft »

This is only the case with Windows.

Was a bit tricky to get, but only tested at 100% display

Fast making code ;)

Update
- Enter event

Code: Select all

Procedure test()
	Debug "*OUT*"
EndProcedure

Structure pointex
  StructureUnion
    p.q
    Point.point
  EndStructureUnion
EndStructure


If OpenWindow(0, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	CanvasGadget(0, 10, 10, 200, 200); ,#PB_Canvas_ClipMouse
	
	BindEvent(#PB_Event_Gadget,@test(),0,0,#PB_EventType_MouseLeave)
	Repeat
		Event = WaitWindowEvent()

		If Event = #PB_Event_Gadget And EventGadget() = 0
			Select EventType()
			Case #PB_EventType_MouseLeave
				Debug "OUT"
			Case #PB_EventType_MouseEnter
				Debug "IN"
			Case #PB_EventType_LeftButtonDown,#PB_EventType_MouseMove
			  If GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
			    CompilerIf #PB_Compiler_OS = #PB_OS_Windows
			      Global gadget_rect.rect, mouse.pointex, lockevent_out
  				  GetClientRect_(GadgetID(0), gadget_rect)
  				  ClientToScreen_(GadgetID(0), gadget_rect)
  				  gadget_rect\right + gadget_rect\left
  				  gadget_rect\bottom + gadget_rect\top
  				  GetCursorPos_(mouse)
  				  If Not PtInRect_(gadget_rect, mouse\p)
  				    If Not lockevent_out
    				    PostEvent(#PB_Event_Gadget, GetActiveWindow(), 0, #PB_EventType_MouseLeave)
    				    lockevent_out = #True
    				  EndIf
    				  Continue
    				Else
    				  If lockevent_out
    				    PostEvent(#PB_Event_Gadget, GetActiveWindow(), 0, #PB_EventType_MouseEnter)
    				    lockevent_out = #False
    				    Continue
    				  EndIf
    				EndIf
    			CompilerEndIf
    			Debug "Drawing ..."
					If StartDrawing(CanvasOutput(0))
						x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
						y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
						Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
						StopDrawing()
					EndIf
				EndIf
			EndSelect
		EndIf

	Until Event = #PB_Event_CloseWindow
EndIf
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4951
Joined: Sun Apr 12, 2009 6:27 am

Re: Get MouseLeave event while mouse button is pressed

Post by RASHAD »

For Windows

Code: Select all

Procedure test()
  Debug "*OUT*"
EndProcedure

If OpenWindow(0, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 10, 10, 200, 200); ,#PB_Canvas_ClipMouse
  
  BindEvent(#PB_Event_Gadget,@test(),0,0,#PB_EventType_MouseLeave)
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = 1
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            ReleaseCapture_()
            Select EventType()
              Case #PB_EventType_MouseLeave
                Debug "OUT"
              Case #PB_EventType_MouseEnter
                Debug "IN"
              Case #PB_EventType_LeftButtonDown,#PB_EventType_MouseMove
                If GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton        
                  If StartDrawing(CanvasOutput(0))
                    x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
                    y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
                    Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
                    StopDrawing()
                  EndIf
                EndIf
            EndSelect
        EndSelect
    EndSelect
    
  Until Quit = 1
EndIf
Egypt my love
User avatar
mk-soft
Always Here
Always Here
Posts: 6224
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Get MouseLeave event while mouse button is pressed

Post by mk-soft »

@Rashad

100 Points Better ;)
Thanks
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
Post Reply