Page 1 sur 2

Canvasgadget et mouse

Publié : dim. 06/oct./2013 12:32
par blendman
J'ai remarqué qu'avec le canvas :
- si on clique dans la surface du canvas et qu'on reste cliqué, il reste actif, même si on sort du canvas.
- si on ne clique pas dessus, qu'on y arrive ensuite (mouseEnter ou mousemove) il ne reste pas actif si on en sort.

Savez-vous s'il existe une technique pour reste actif comme lors d'un clic sur le canvas mais en partant d'un mousemove ?

Code : Tout sélectionner

Enumeration
  #IMAGE_Content  ; stores the previous CanvasGadget content while the mouse is down
  #IMAGE_Color
EndEnumeration

Enumeration
  #GADGET_CanvasFond
  #GADGET_Canvas
  #GADGET_Box
  #GADGET_Clear
  #GADGET_Area
EndEnumeration

#win = 0
#statusbar = 0

Global CurrentColor, StartX, StartY

Procedure DrawAction(x, y, EventType)
  
  If StartDrawing(CanvasOutput(#GADGET_Canvas))
    
    DrawImage(ImageID(#IMAGE_Content), 0, 0)
    Box(StartX, StartY, x-StartX, y-StartY, CurrentColor)
        
    StopDrawing()
  EndIf

EndProcedure


CurrentColor = RGB(120,120,120)
CreateImage(#IMAGE_Color, 35, 35, 24)
CreateImage(#IMAGE_Content, 380, 380, 24)

If OpenWindow(#win, 0, 0, 800, 600, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  
  If ScrollAreaGadget(#GADGET_Area, 70, 70, WindowWidth(#win) - 90, WindowHeight(#win) - 90, WindowWidth(#win), WindowHeight(#win))
    CanvasGadget(#GADGET_Canvas, 110, 110, 380, 380, #PB_Canvas_Keyboard)
    
    CloseGadgetList()
  EndIf

  ButtonGadget(#GADGET_Box,    10, 10, 50, 25, "Box",    #PB_Button_Toggle)
  ButtonGadget(#GADGET_Clear,  10, 40, 50, 25, "Clear")
  
  
  SetGadgetState(#GADGET_Box, 1)
  SetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Cursor, #PB_Cursor_Cross)
  SetActiveGadget(#GADGET_Canvas)
  
  CreateStatusBar(#statusbar,WindowID(#win))
  AddStatusBarField(200)
  AddStatusBarField(200)
  AddStatusBarField(200)
  
  Repeat
    Event = WaitWindowEvent()    
    EventGadget = EventGadget()

    If Event = #PB_Event_Gadget
    
      Select EventGadget()
      
        Case #GADGET_Canvas
          
          X = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseX)
          Y = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseY)
          
          If Start = 0
            If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
              Start =1              
              StartX = X
              StartY = Y
            EndIf
          EndIf
          
          If paint 
            DrawAction(X, Y, EventType())
          EndIf
          StatusBarText(#statusbar, 1, "X : "+Str(x)+" / Y :"+Str(y))
          
          Type = EventType()
        
          Select EventType()
          
            Case #PB_EventType_LeftButtonDown
              paint = 1 
              If StartDrawing(ImageOutput(#IMAGE_Content))
                DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
                StopDrawing()
              EndIf
              
              StartX = X
              StartY = Y
              DrawAction(X, Y, EventType())

            
            Case #PB_EventType_LeftButtonUp
              DrawAction(X, Y, EventType())                        
              paint = 0
              Start = 0
              
            Case #PB_EventType_MouseMove
              If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
                If paint = 0
                  paint = 1
                  If StartDrawing(ImageOutput(#IMAGE_Content))
                    DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
                    StopDrawing()
                  EndIf
                EndIf
                DrawAction(X, Y, EventType())            
              EndIf
              
          EndSelect
      
        Case #GADGET_Clear
          If StartDrawing(CanvasOutput(#GADGET_Canvas))
            Box(0, 0, 380, 380, $FFFFFF)
            StopDrawing()
          EndIf
          SetActiveGadget(#GADGET_Canvas)
          
                
      EndSelect
    
    EndIf
    
  Until Event = #PB_Event_CloseWindow

EndIf
On voit sur ce code que si on clique sur le gadget et qu'on en sort, la position de la souris reste updatée. Mais pas si on commence à cliquer à l'extérieur du gadget.

Si vous avez une idée pour résoudre ça ^^.

Re: Canvasgadget et mouse

Publié : dim. 06/oct./2013 12:42
par nico
Mais pas si on commence à cliquer à l'extérieur du gadget
De mon coté si.

Re: Canvasgadget et mouse

Publié : dim. 06/oct./2013 14:02
par blendman
nico a écrit :
Mais pas si on commence à cliquer à l'extérieur du gadget
De mon coté si.
Même si tu ressors du canvas, ça continue à updater la position de la souris, comme lorsqu'on a cliqué ?

Re: Canvasgadget et mouse

Publié : dim. 06/oct./2013 14:34
par falsam
Si je clique en dehors du Canvas et que je bouge ma souris pour venir sur le canvas les coordonnées de la souris sont mis à jour même si je sors du canvas par la suite.

Idem forcement quand je commence à cliquer sur le canvas.

Re: Canvasgadget et mouse

Publié : dim. 06/oct./2013 15:07
par blendman
falsam a écrit :Si je clique en dehors du Canvas et que je bouge ma souris pour venir sur le canvas les coordonnées de la souris sont mis à jour même si je sors du canvas par la suite.
ah et bien, ça ne marche pas sous win8 ça :(

Chez toi ça marche même sous win8 ?

Re: Canvasgadget et mouse

Publié : dim. 06/oct./2013 15:24
par falsam
blendman a écrit :Chez toi ça marche même sous win8 ?
Sous Windows 7 et Windows 8 le résultat est le même. les coordonnées de la souris sont bien mise à jour.

Par contre (Windows 7 et 8) et je viens de m'en rendre contre que maintenant. Si je reviens sur le canvas après avoir relâcher le clic gauche de la souris en dehors du canvas, le cube précédemment crée se met à jour en fonction des nouvelles coordonnées de la souris.

Re: Canvasgadget et mouse

Publié : dim. 06/oct./2013 16:26
par blendman
falsam a écrit :Sous Windows 7 et Windows 8 le résultat est le même. les coordonnées de la souris sont bien mise à jour.
Tu es vraiment sûr ?
car j'ai testé avec win8 et win7 et chez moi, j'ai le même résultat sur 2 machines différentes :
- si je clique en dehors du canvas (pour commencer) et que je reviens dans le canvas : les coordonnées sont updatées. Mais dès que je ressors du canvas sans relâcher la souris ni rien, elles ne le sont plus. Et si je reviens dans le canvas (toujours en gardant la souris cliquée) elles sont à nouveau updatées.

En faisant ça, toi, ta souris est toujours updatées ?

Re: Canvasgadget et mouse

Publié : dim. 06/oct./2013 16:45
par Ar-S
blendman a écrit : - si je clique en dehors du canvas (pour commencer) et que je reviens dans le canvas : les coordonnées sont updatées. Mais dès que je ressors du canvas sans relâcher la souris ni rien, elles ne le sont plus. Et si je reviens dans le canvas (toujours en gardant la souris cliquée) elles sont à nouveau updatées.
En faisant ça, toi, ta souris est toujours updatées ?
En faisant ça chez moi ça marche W8 x64

Re: Canvasgadget et mouse

Publié : dim. 06/oct./2013 17:00
par falsam
blendman a écrit :si je clique en dehors du canvas (pour commencer)
C'est ce que je fais
blendman a écrit :et que je reviens dans le canvas : les coordonnées sont updatées.
Effectivement
blendman a écrit :Mais dès que je ressors du canvas sans relâcher la souris ni rien, elles ne le sont plus.
Oops oui tu as raison la mise à jour dans le StatusBar ne se fait plus.
blendman a écrit :Et si je reviens dans le canvas (toujours en gardant la souris cliquée) elles sont à nouveau updatées.
Oui

Re: Canvasgadget et mouse

Publié : dim. 06/oct./2013 18:14
par blendman
falsam a écrit :
blendman a écrit :Mais dès que je ressors du canvas sans relâcher la souris ni rien, elles ne le sont plus.
Oops oui tu as raison la mise à jour dans le StatusBar ne se fait plus.i
ah , tu me rassures :)
C'est bien ce qu'il me semble ^^.

En fait, il suffit d'essayer de faire un carré complet englobant la totalité du canvas et on n'y arrive pas.
Il va falloir que je trouve une méthode qui le permette ^^.

Re: Canvasgadget et mouse

Publié : lun. 07/oct./2013 1:31
par Demivec

Code : Tout sélectionner

  Define dx_a, dx_b, dx_c, dy_a, dy_b, dy_c
  dx_a =  WindowX(#win, #PB_Window_FrameCoordinate) + GadgetX(#GADGET_Area) + GadgetX(#GADGET_Canvas) ;positions, constant
  dx_b = WindowX(#win, #PB_Window_InnerCoordinate) - WindowX(#win, #PB_Window_FrameCoordinate) ;border size, used for gadget and window, constant
  dx_c = (dx_a + dx_b * 2 - 1)    ;combined x constants
  dy_a =  WindowY(#win, #PB_Window_FrameCoordinate) + GadgetY(#GADGET_Area) + GadgetY(#GADGET_Canvas) ;positions, constant
  dy_b = WindowY(#win, #PB_Window_InnerCoordinate) - WindowY(#win, #PB_Window_FrameCoordinate) ;menu border, constant
  dy_c = (dy_a + dy_b + dx_b - 1) ;combined y constants
  Repeat
    Event = WaitWindowEvent()    
    EventGadget = EventGadget()
    dx = DesktopMouseX() - dx_c + GetGadgetAttribute(#GADGET_Area, #PB_ScrollArea_X) ;mouse position relative to canvas
    dy = DesktopMouseY() - dy_c + GetGadgetAttribute(#GADGET_Area, #PB_ScrollArea_Y)
;...
;...
      StatusBarText(#statusbar, 1, "X : "+Str(x)+" / Y :"+Str(y) + ", dx" + Str(dx) + ", dy" + Str(dy))
    Else
      StatusBarText(#statusbar, 1, "X : "+Str(x)+" / Y :"+Str(y) + ", dx" + Str(dx) + ", dy" + Str(dy))
    EndIf 
        
  Until Event = #PB_Event_CloseWindow

Re: Canvasgadget et mouse

Publié : lun. 07/oct./2013 7:09
par blendman
@demivec : désolé, ça ne marche pas ^^. ON n'arrive pas à dessiner un rectangle complet sur tout la surface du canvas, si on démarrer en dehors du canvas.

(Sorry, it doesn't work.
You can't draw a complete rectangle if you start outside the canvas)

Code : Tout sélectionner


Enumeration
  #IMAGE_Content  ; stores the previous CanvasGadget content while the mouse is down
  #IMAGE_Color
EndEnumeration

Enumeration
  #GADGET_CanvasFond
  #GADGET_Canvas
  #GADGET_Box
  #GADGET_Clear
  #GADGET_Area
EndEnumeration

#win = 0
#statusbar = 0

Global CurrentColor, StartX, StartY

Procedure DrawAction(x, y, EventType)
 
  If StartDrawing(CanvasOutput(#GADGET_Canvas))
   
    DrawImage(ImageID(#IMAGE_Content), 0, 0)
    Box(StartX, StartY, x-StartX, y-StartY, CurrentColor)
       
    StopDrawing()
  EndIf

EndProcedure


CurrentColor = RGB(120,120,120)
CreateImage(#IMAGE_Color, 35, 35, 24)
CreateImage(#IMAGE_Content, 380, 380, 24)

If OpenWindow(#win, 0, 0, 800, 600, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
 
  If ScrollAreaGadget(#GADGET_Area, 70, 70, WindowWidth(#win) - 90, WindowHeight(#win) - 90, WindowWidth(#win), WindowHeight(#win))
    CanvasGadget(#GADGET_Canvas, 110, 110, 380, 380, #PB_Canvas_Keyboard)
   
    CloseGadgetList()
  EndIf

  ButtonGadget(#GADGET_Box,    10, 10, 50, 25, "Box",    #PB_Button_Toggle)
  ButtonGadget(#GADGET_Clear,  10, 40, 50, 25, "Clear")
 
 
  SetGadgetState(#GADGET_Box, 1)
  SetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Cursor, #PB_Cursor_Cross)
  SetActiveGadget(#GADGET_Canvas)
 
  CreateStatusBar(#statusbar,WindowID(#win))
  AddStatusBarField(200)
  AddStatusBarField(200)
  AddStatusBarField(200)
  
  
  Define dx_a, dx_b, dx_c, dy_a, dy_b, dy_c
  dx_a =  WindowX(#win, #PB_Window_FrameCoordinate) + GadgetX(#GADGET_Area) + GadgetX(#GADGET_Canvas) ;positions, constant
  dx_b = WindowX(#win, #PB_Window_InnerCoordinate) - WindowX(#win, #PB_Window_FrameCoordinate) ;border size, used for gadget and window, constant
  dx_c = (dx_a + dx_b * 2 - 1)    ;combined x constants
  dy_a =  WindowY(#win, #PB_Window_FrameCoordinate) + GadgetY(#GADGET_Area) + GadgetY(#GADGET_Canvas) ;positions, constant
  dy_b = WindowY(#win, #PB_Window_InnerCoordinate) - WindowY(#win, #PB_Window_FrameCoordinate) ;menu border, constant
  dy_c = (dy_a + dy_b + dx_b - 1) ;combined y constants

  
  Repeat
    
    Event = WaitWindowEvent()   
    EventGadget = EventGadget()
    dx = DesktopMouseX() - dx_c + GetGadgetAttribute(#GADGET_Area, #PB_ScrollArea_X) ;mouse position relative to canvas
    dy = DesktopMouseY() - dy_c + GetGadgetAttribute(#GADGET_Area, #PB_ScrollArea_Y)


    If Event = #PB_Event_Gadget
   
      Select EventGadget()
     
        Case #GADGET_Canvas
         
          X = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseX)
          Y = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseY)
         
          If Start = 0
            If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
              Start =1             
              StartX = X
              StartY = Y
            EndIf
          EndIf
         
          If paint
            DrawAction(X, Y, EventType())
          EndIf
          ;StatusBarText(#statusbar, 1, "X : "+Str(x)+" / Y :"+Str(y))
          

      StatusBarText(#statusbar, 1, "X : "+Str(x)+" / Y :"+Str(y) + ", dx" + Str(dx) + ", dy" + Str(dy))


          
          
          Type = EventType()
       
          Select EventType()
         
            Case #PB_EventType_LeftButtonDown
              paint = 1
              If StartDrawing(ImageOutput(#IMAGE_Content))
                DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
                StopDrawing()
              EndIf
             
              StartX = X
              StartY = Y
              DrawAction(X, Y, EventType())

           
            Case #PB_EventType_LeftButtonUp
              DrawAction(X, Y, EventType())                       
              paint = 0
              Start = 0
             
            Case #PB_EventType_MouseMove
              If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
                If paint = 0
                  paint = 1
                  If StartDrawing(ImageOutput(#IMAGE_Content))
                    DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
                    StopDrawing()
                  EndIf
                EndIf
                DrawAction(X, Y, EventType())           
              EndIf
             
          EndSelect
     
        Case #GADGET_Clear
          If StartDrawing(CanvasOutput(#GADGET_Canvas))
            Box(0, 0, 380, 380, $FFFFFF)
            StopDrawing()
          EndIf
          SetActiveGadget(#GADGET_Canvas)
         
               
      EndSelect
   
    EndIf
   
  Until Event = #PB_Event_CloseWindow

EndIf
 
  

Re: Canvasgadget et mouse

Publié : lun. 07/oct./2013 13:45
par Mesa
Ça bug un peu mais c'est peut-être ce que tu recherches (?)

Code : Tout sélectionner

Enumeration
	#IMAGE_Content  ; stores the previous CanvasGadget content while the mouse is down
	#IMAGE_Color
EndEnumeration

Enumeration
	#GADGET_CanvasFond
	#GADGET_Canvas
	#GADGET_Box
	#GADGET_Clear
	#GADGET_Area
EndEnumeration

#win = 0
#statusbar = 0

Global CurrentColor, StartX, StartY

Procedure DrawAction(x, y, EventType)

	If StartDrawing(CanvasOutput(#GADGET_Canvas))
		
		DrawImage(ImageID(#IMAGE_Content), 0, 0)
		Box(StartX, StartY, x-StartX, y-StartY, CurrentColor)
				
		StopDrawing()
	EndIf

EndProcedure


CurrentColor = RGB(120,120,120)
CreateImage(#IMAGE_Color, 35, 35, 24)
CreateImage(#IMAGE_Content, 380, 380, 24)

If OpenWindow(#win, 0, 0, 800, 600, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)


	If ScrollAreaGadget(#GADGET_Area, 70, 70, WindowWidth(#win) - 90, WindowHeight(#win) - 90, WindowWidth(#win), WindowHeight(#win))
		CanvasGadget(#GADGET_Canvas, 110, 110, 380, 380, #PB_Canvas_Keyboard)
		
		CloseGadgetList()
	EndIf

	ButtonGadget(#GADGET_Box,    10, 10, 50, 25, "Box",    #PB_Button_Toggle)
	ButtonGadget(#GADGET_Clear,  10, 40, 50, 25, "Clear")


	SetGadgetState(#GADGET_Box, 1)
	SetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Cursor, #PB_Cursor_Cross)
	SetActiveGadget(#GADGET_Canvas)

	CreateStatusBar(#statusbar,WindowID(#win))
	AddStatusBarField(200)
	AddStatusBarField(200)
	AddStatusBarField(200)
	
	
	Define dx_a, dx_b, dx_c, dy_a, dy_b, dy_c
	dx_a =  WindowX(#win, #PB_Window_FrameCoordinate) + GadgetX(#GADGET_Area) + GadgetX(#GADGET_Canvas) ;positions, constant
	dx_b = WindowX(#win, #PB_Window_InnerCoordinate) - WindowX(#win, #PB_Window_FrameCoordinate) ;border size, used for gadget and window, constant
	dx_c = (dx_a + dx_b * 2 - 1)    ;combined x constants
	dy_a =  WindowY(#win, #PB_Window_FrameCoordinate) + GadgetY(#GADGET_Area) + GadgetY(#GADGET_Canvas) ;positions, constant
	dy_b = WindowY(#win, #PB_Window_InnerCoordinate) - WindowY(#win, #PB_Window_FrameCoordinate) ;menu border, constant
	dy_c = (dy_a + dy_b + dx_b - 1) ;combined y constants

	
	Repeat
		
		Event = WaitWindowEvent()   
		EventGadget = EventGadget()
		dx = DesktopMouseX() - dx_c + GetGadgetAttribute(#GADGET_Area, #PB_ScrollArea_X) ;mouse position relative to canvas
		dy = DesktopMouseY() - dy_c + GetGadgetAttribute(#GADGET_Area, #PB_ScrollArea_Y)


		If Event = #PB_Event_Gadget
		
			Select EventGadget()
			
				Case #GADGET_Canvas
					
					X = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseX)
					Y = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseY)
					
					If Start = 0
						If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
							Start =1             
							StartX = X
							StartY = Y
						EndIf
					EndIf
					
					If paint
						DrawAction(dx, dy, EventType())
					EndIf
					;StatusBarText(#statusbar, 1, "X : "+Str(x)+" / Y :"+Str(y))
					

			StatusBarText(#statusbar, 1, "X : "+Str(x)+" / Y :"+Str(y) + ", dx" + Str(dx) + ", dy" + Str(dy))


					
					
					Type = EventType()
				
					Select EventType()
					
						Case #PB_EventType_LeftButtonDown
							paint = 1
							If StartDrawing(ImageOutput(#IMAGE_Content))
								DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
								StopDrawing()
							EndIf
							
							StartX = X
							StartY = Y
							DrawAction(dx, dy, EventType())

						
						Case #PB_EventType_LeftButtonUp
							DrawAction(dx, dy, EventType())                       
							paint = 0
							Start = 0
							
						Case #PB_EventType_MouseMove
							If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
								If paint = 0
									paint = 1
									If StartDrawing(ImageOutput(#IMAGE_Content))
										DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
										StopDrawing()
									EndIf
								EndIf
								DrawAction(dx, dy, EventType())           
							EndIf
							
					EndSelect
			
				Case #GADGET_Clear
					If StartDrawing(CanvasOutput(#GADGET_Canvas))
						Box(0, 0, 380, 380, $FFFFFF)
						StopDrawing()
					EndIf
					SetActiveGadget(#GADGET_Canvas)
					
								
			EndSelect
		
		EndIf
		
	Until Event = #PB_Event_CloseWindow

EndIf

	
Mesa.

Re: Canvasgadget et mouse

Publié : lun. 07/oct./2013 16:22
par blendman
Hélas, non, ça ne marche toujours pas ^^
Essaie de faire un rectangle complet sur tout la surface du canvas, en partant de l'extérieur du canvas, en y entrant et en en sortant pour le terminer ;)

Re: Canvasgadget et mouse

Publié : lun. 07/oct./2013 19:02
par Backup
c'est un peu normal

le gadget accepte les events, qui le concerne !
tant que tu dessine dans le Canvas, ça marche

si tu cherche a sortir du canvas en etant bouton gauche cliqué , le canva, ne récupère plus les events
puisque tu te trouves en dehors de lui ...

chaque gadget ne peut récupérer que les events qui le concerne !

lorsque tu sort du canvas , tu te trouve sur le gadget #GADGET_Area ... plus sur le Canvas ...
et le Area , n'est pas étudié pour recevoir les events de la souris sur sa surface , mais seulement sur ses ascenseurs ...

a mon avis ça marcherai peut être avec juste le Canvas , (sans AreaGadget )
et un callback concernant la fenetre juste en dessous de lui
dans ce cas, si tu sort du Canvas, tu te retrouverai sur la fenetre, et a se moment la , le callback permettrai de récupérer le positionnement et le mouvement de la souris ... :)