Page 2 sur 2

Re: Canvasgadget et mouse

Publié : lun. 07/oct./2013 19:13
par blendman
Je comprends bien, pourtant, ça fonctionne si on clique en premier sur le canvas et qu'on sort du canvas, il garde l'event même si on n'est plus sur le canvas :).

Donc, je me demandais s'il n'existait pas une technique permettant d'avoir la même chose mais en commençant à cliquer à l'extérieur du canvas.

Re: Canvasgadget et mouse

Publié : lun. 07/oct./2013 19:16
par Backup
chez moi c'est l'inverse !

je commence a cliquer en dehors , puis lorsque le pointeur entre dans le canvas le dessin se fait

lorsque je sort du canvas, le dessin s'arrete ! (ce qui me semble normal puisque le canvas perd la main a ce moment là )

(Pb 5.20 x86)

Re: Canvasgadget et mouse

Publié : lun. 07/oct./2013 21:45
par falsam
Je ne sais pas si la technique est académique mais pourrais tu essayer ce code.

Code : Tout sélectionner

Enumeration
  #Mainform
  
  #Clear
  #Color
  
  #Alpha
  
  #ScrollArea
  #ScrollArea_Canvas
  #Canvas  
  
  #Image
  #ImageCanvasSave
  #ImageCanvasCurrent
EndEnumeration

Define.l Event, GEvent, TEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global Paint.b, Color.i, Alpha.i

Procedure Clear()
  CreateImage(#ImageCanvasSave, 500, 300, 32, #PB_Image_Transparent)
  If StartDrawing(CanvasOutput(#Canvas)) 
    Box(0, 0, 500, 300, RGBA(255, 255, 255,255))
    StopDrawing()
  EndIf
 
EndProcedure

Procedure SelectColor()
  Protected Value.i
  Value = ColorRequester(Color)
  If Value > -1
    Color = RGBA(Red(Value), Green(Value), Blue(Value), Alpha)
  EndIf
EndProcedure


Procedure DrawBox(X1.i, Y1.i)
  If Paint = #True
    X2 = GetGadgetAttribute(#ScrollArea_Canvas, #PB_Canvas_MouseX) - GadgetX(#Canvas)
    Y2 = GetGadgetAttribute(#ScrollArea_Canvas, #PB_Canvas_MouseY) - GadgetY(#Canvas)
    
    CreateImage(#Image, 500, 300, 32, #PB_Image_Transparent) 
    CreateImage(#ImageCanvasCurrent, 500, 300, 32, #PB_Image_Transparent) 
    
    If StartDrawing(ImageOutput(#Image))
      DrawingMode(#PB_2DDrawing_AllChannels)
      Box(X1, Y1, X2-X1, Y2-Y1, Color) 
      StopDrawing()
    EndIf
    
    If StartDrawing(ImageOutput(#ImageCanvasCurrent))
      DrawAlphaImage(ImageID(#ImageCanvasSave), 0, 0)
      DrawAlphaImage(ImageID(#Image), 0, 0)
      StopDrawing()
    EndIf

    If StartDrawing(CanvasOutput(#Canvas)) 
      Box(0, 0, 500, 300, RGBA(255, 255, 255,255))
      DrawAlphaImage(ImageID(#ImageCanvasSave), 0, 0)
      DrawAlphaImage(ImageID(#Image), 0, 0)
      StopDrawing()
    EndIf
    
  EndIf
EndProcedure

Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 800, 600, "New Form", WindowStyle)
  
  ButtonGadget(#Clear, 5, 10, 40, 24, "Clear")
  ButtonGadget(#Color, 50, 10, 40, 24, "Color")
  TextGadget(#PB_Any, 100, 12, 40, 20, "Alpha") 
  SpinGadget(#Alpha, 130, 10, 50, 22, 0, 255, #PB_Spin_Numeric)  
    
  ScrollAreaGadget(#ScrollArea, 50, 50, 700, 500, 1600, 1200)
    
  CanvasGadget(#ScrollArea_Canvas, 0, 0, 1600, 1200)
  StartDrawing(CanvasOutput(#ScrollArea_Canvas))
  Box(0, 0, 1600, 1200, RGB(210, 180, 140))
  StopDrawing()
  
  CanvasGadget(#Canvas, 100, 100, 500, 300)
  StartDrawing(CanvasOutput(#Canvas))
  Box(0, 0, 500, 300, RGBA(255, 255, 255,255))
  StopDrawing()
  
  CloseGadgetList() 
EndProcedure

Procedure Start() 
  UsePNGImageEncoder()
   
  CreateImage(#Image, 500, 300, 32, #PB_Image_Transparent) 
  CreateImage(#ImageCanvasSave, 500, 300, 32, #PB_Image_Transparent)
  CreateImage(#ImageCanvasCurrent, 500, 300, 32, #PB_Image_Transparent)
  
  Open_MainForm()
  
  Color = RGBA(128, 128, 128, 180)
  Alpha = 180
  SetGadgetState (#Alpha, 180)
  
EndProcedure

start()

Repeat
  Event  = WaitWindowEvent(10)
  GEvent = EventGadget()
  TEvent = EventType()
  Select Event     
       
    Case #PB_Event_Gadget
      Select GEvent
        Case #Clear
          Clear()
          
        Case #Color
          SelectColor()
          
        Case #Alpha
          Alpha = GetGadgetState(#Alpha)
          Color = RGBA(Red(Color), Green(Color), Blue(Color), Alpha)
                    
        Case #ScrollArea_Canvas
          
          Select TEvent
            Case #PB_EventType_LeftButtonDown
              If Paint = #False
                X1 = GetGadgetAttribute(#ScrollArea_Canvas, #PB_Canvas_MouseX) - GadgetX(#Canvas)
                Y1 = GetGadgetAttribute(#ScrollArea_Canvas, #PB_Canvas_MouseY) - GadgetY(#Canvas)
                             
                Paint = #True  
                
              EndIf
                            
            Case #PB_EventType_LeftButtonUp
              Paint = #False
              
              CopyImage(#ImageCanvasCurrent, #ImageCanvasSave) 
              
              ;Sauvegarde de l'image sur le bureau
              SaveImage(#ImageCanvasSave, GetHomeDirectory()+"desktop\dummysave.png", #PB_ImagePlugin_PNG)
              
            Case #PB_EventType_MouseMove
              DrawBox(X1, Y1)
              
          EndSelect
      EndSelect
        
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
En prime la sélection d'une couleur alpha et sauvegarde automatique de l'image finale sur le bureau. Une base pour en faire autre chose :)

Re: Canvasgadget et mouse

Publié : mar. 08/oct./2013 8:49
par Backup
ça marche bien chez moi :)

Re: Canvasgadget et mouse

Publié : mar. 08/oct./2013 9:57
par falsam
Merci d'avoir essayer Dobro :)

Re: Canvasgadget et mouse

Publié : mar. 08/oct./2013 11:36
par blendman
Merci falsam pour cet exemple.
J'avais effectivement réfléchi à une technique utilisant un canvas sur un canvas et ton exemple fonctionne parfaitement.

Je vais regarder si je peux modifier mon code en conséquence pour y introduire cette technique ;).