Canvasgadget et mouse

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Canvasgadget et mouse

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Canvasgadget et mouse

Message 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)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Canvasgadget et mouse

Message 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 :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Canvasgadget et mouse

Message par Backup »

ça marche bien chez moi :)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Canvasgadget et mouse

Message par falsam »

Merci d'avoir essayer Dobro :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Canvasgadget et mouse

Message 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 ;).
Répondre