[4.60 beta]canvas gadget

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

[4.60 beta]canvas gadget

Message par blendman »

yop les amis

J'ai testé la surface de dessin (canvas_gadget). C'est pas mal du tout mais j'ai quelques questions :
- je n'ai pas trouvé si on pouvait changer la couleur du canvas ou la transparence. Ce serait très sympa pour créer un système de calque façon photoshop, ou pour utiliser un canvas dans un jeu par exemple :).
- dans l'exemple fourni, y'a t-il moyen de dessiner avec un sprite transparent(png) ? J'ai essayé mais cela ne dessine pas le sprite sur le canvas, mais sur le screen, donc on ne le voit pas :P, mais je pense que ma technique n'est pas la bonne.
Si vous savez comment faire ça, cela m'intéresse ;).

le code :

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - CanvasGadget example file
;
;    (c) 2010 - Fantaisie Software
;
; ------------------------------------------------------------
;

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

Enumeration
  #GADGET_Canvas
  #GADGET_Color 
  #GADGET_BrushSoft
  #GADGET_Brush
  #GADGET_Line
  #GADGET_Box
  #GADGET_Circle
  #GADGET_Fill
  #GADGET_Clear 
  #GADGET_Load
  #GADGET_Save
EndEnumeration

Global CurrentColor, CurrentMode, StartX, StartY, CurrentBrush,transparence

transparence = 255
CurrentBrush = 1

; Draw the mouse action result depending on the currently selected mode and event type
;
Procedure DrawAction(x, y, EventType)

  If StartDrawing(CanvasOutput(#GADGET_Canvas))
    Select CurrentMode
        
        
      Case #GADGET_BrushSoft
        If EventType = #PB_EventType_LeftButtonDown Or EventType = #PB_EventType_MouseMove
          DrawImage(ImageID(#IMAGE_Content), 0, 0)
          Start3D()
          DisplaySprite3D(CurrentBrush,x,y,transparence)
          Stop3D()
        EndIf  
    
      Case #GADGET_Brush
        If EventType = #PB_EventType_LeftButtonDown Or EventType = #PB_EventType_MouseMove
          Circle(x, y, 5, CurrentColor)
          ;CircularGradient(x,y,5)
        EndIf
        
      Case #GADGET_Line
        DrawImage(ImageID(#IMAGE_Content), 0, 0)
        LineXY(StartX, StartY, x, y, CurrentColor)
      
      Case #GADGET_Box
        DrawImage(ImageID(#IMAGE_Content), 0, 0)
        Box(StartX, StartY, x-StartX, y-StartY, CurrentColor)
        
      Case #GADGET_Circle
        DrawImage(ImageID(#IMAGE_Content), 0, 0)
        
        If x > StartX
          rx = x - StartX
        Else
          rx = StartX - x
        EndIf
        
        If y > StartY
          ry = y - StartY
        Else
          ry = StartY - y
        EndIf
        
        If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Modifiers) & #PB_Canvas_Control
          ry = rx
        EndIf
        
        Ellipse(StartX, StartY, rx, ry, CurrentColor)
      
      Case #GADGET_Fill
        If EventType = #PB_EventType_LeftButtonDown
          FillArea(x, y, -1, CurrentColor)
        EndIf
  
    EndSelect
    
    StopDrawing()
  EndIf

EndProcedure

UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()

CurrentColor = $000000
CurrentMode  = #GADGET_Brush
CreateImage(#IMAGE_Color, 35, 35, 24)
CreateImage(#IMAGE_Content, 380, 380, 24)

InitSprite() : InitSprite3D()

If OpenWindow(0, 0, 0, 460, 400, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
  OpenWindowedScreen(WindowID(0),0,0,460,400,0,0,0)
  LoadSprite(1,"Data\brush9.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
  CreateSprite3D(1,1)  

  ClearScreen(RGB(125,125,125))
  
  
  CanvasGadget(#GADGET_Canvas, 10, 10, 380, 380, #PB_Canvas_ClipMouse)

  ButtonImageGadget(#GADGET_Color, 400, 10, 50, 50, ImageID(#IMAGE_Color))
  
  ButtonGadget(#GADGET_BrushSoft,  400, 70, 50, 25, "Brush",  #PB_Button_Toggle)
  ButtonGadget(#GADGET_Brush,  400, 100, 50, 25, "Paint",  #PB_Button_Toggle)
  ButtonGadget(#GADGET_Line,   400, 130, 50, 25, "Line",   #PB_Button_Toggle)
  ButtonGadget(#GADGET_Box,    400, 160, 50, 25, "Box",    #PB_Button_Toggle)
  ButtonGadget(#GADGET_Circle, 400, 190, 50, 25, "Circle", #PB_Button_Toggle)
  ButtonGadget(#GADGET_Fill,   400, 220, 50, 25, "Fill",   #PB_Button_Toggle)
    
  ButtonGadget(#GADGET_Clear,  400, 280, 50, 25, "Clear")
  
  ButtonGadget(#GADGET_Load,   400, 335, 50, 25, "Load")
  ButtonGadget(#GADGET_Save,   400, 365, 50, 25, "Save")
  
  SetGadgetState(#GADGET_Brush, 1)
  SetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Cursor, #PB_Cursor_Cross)


  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget
    
      Select EventGadget()
      
        Case #GADGET_Canvas
          X = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseX)
          Y = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseY)
          Type = EventType()
        
          Select EventType()
          
            Case #PB_EventType_LeftButtonDown
              ;
              ; This stores the current content of the CanvasGadget in #IMAGE_Content,
              ; so it can be re-drawn while the mouse moves
              ;
              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())                        
            
            Case #PB_EventType_MouseMove
              If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
                DrawAction(X, Y, EventType())            
              EndIf
                      
          EndSelect
        
        Case #GADGET_Color
          CurrentColor = ColorRequester(CurrentColor)
          If StartDrawing(ImageOutput(#IMAGE_Color))
            Box(0, 0, 35, 35, CurrentColor)
            StopDrawing()
            SetGadgetAttribute(#GADGET_Color, #PB_Button_Image, ImageID(#IMAGE_Color))
          EndIf
          
        Case #GADGET_BrushSoft,#GADGET_Brush, #GADGET_Line, #GADGET_Box, #GADGET_Circle, #GADGET_Fill
          EventGadget = EventGadget()
          For Gadget = #GADGET_BrushSoft To #GADGET_Fill
            If Gadget = EventGadget
              SetGadgetState(Gadget, 1) 
            Else
              SetGadgetState(Gadget, 0) ; unset the state of all other gadgets
            EndIf
          Next Gadget          
          CurrentMode = EventGadget             
      
        Case #GADGET_Clear
          If StartDrawing(CanvasOutput(#GADGET_Canvas))
            Box(0, 0, 380, 380, $FFFFFF)
            StopDrawing()
          EndIf
      
        Case #GADGET_Load
          File$ = OpenFileRequester("Load Image...", "", "JPEG Images|*.jpeg|All Files|*.*", 0)
          If File$
            If LoadImage(#IMAGE_LoadSave, File$)
              If StartDrawing(CanvasOutput(#GADGET_Canvas))
                Box(0, 0, 380, 380, $FFFFFF)
                DrawImage(ImageID(#IMAGE_LoadSave), 0, 0)
                StopDrawing()
              EndIf
              FreeImage(#IMAGE_LoadSave)
            Else
              MessageRequester("CanvasGadget", "Cannot load image: " + File$)
            EndIf
          EndIf
              
        Case #GADGET_Save
          File$ = SaveFileRequester("Save Image...", File$, "JPEG Images|*.jpeg|All Files|*.*", 0)
          If File$ And (FileSize(File$) = -1 Or MessageRequester("CanvasGadget", "Overwrite this file? " + File$, #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes)
            If CreateImage(#IMAGE_LoadSave, 380, 380, 24) And StartDrawing(ImageOutput(#IMAGE_LoadSave))
              DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
              StopDrawing()
              
              If SaveImage(#IMAGE_LoadSave, File$, #PB_ImagePlugin_JPEG) = 0
                MessageRequester("CanvasGadget", "Cannot save image: " + File$)
              EndIf
              
              FreeImage(#IMAGE_LoadSave)
            EndIf            
          EndIf
                
      EndSelect
    
    EndIf
    
  Until Event = #PB_Event_CloseWindow

EndIf
et le sprite utilisé :
http://blendman.free.fr/dev/pb/brush9.png
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [4.60 beta]canvas gadget

Message par G-Rom »

J'ai pas testé , à mon avis le canvas est une nouvelle facon de dessiner au même titre qu'une fenetre ou une image.
c'est un peu du software, ca n'utilise pas d'API du type DirectX , ou OpenGL , donc pas de sprite à l'intérieur.
Pour un système de calques , c'est très simple. chaque calque est une image , que tu affiches dans ton canvas
( que tu efface au préalable )
Répondre