Page 1 sur 2

Demande conseil dessiner sélection 2D

Publié : ven. 13/mai/2016 13:34
par Shadow
Bonjour,

Pour mes besoin je vais essayer de créer une procédure ou autre pour dessiner
une sélection personnalisable sur la surface voulue...

Je vais utiliser la bibliothèque standard 2D car je suis trop limité avec l'autre.
Sans parler code, comment je dois m'y prendre pour que se soit rapide ?

Si je créer une image avec par exemple des points ou des tiret a X distance
et si l'image est grande, ça risque de ramer non ?

Exemple, créer une image (Sélection) avec des points distancés de 1
pixel, sa risque de ramer grave...

Quel méthode utiliser, comment procéder ?

Re: Demande conseil dessiner sélection 2D

Publié : ven. 13/mai/2016 13:55
par Bernie
Salut Shadow

est ce que c'est ça que tu veux faire mais en mieux ?
ce code est fourni avec PB :

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - CanvasGadget example file
;
;    (c) 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_Brush
  #GADGET_Line
  #GADGET_Box
  #GADGET_Circle
  #GADGET_Fill
  #GADGET_Clear 
  #GADGET_Load
  #GADGET_Save
EndEnumeration

Global CurrentColor, CurrentMode, StartX, StartY

; 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_Brush
        If EventType = #PB_EventType_LeftButtonDown Or EventType = #PB_EventType_MouseMove
          Circle(x, y, 5, CurrentColor)
        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()

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

If OpenWindow(0, 0, 0, 460, 400, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(#GADGET_Canvas, 10, 10, 380, 380, #PB_Canvas_ClipMouse)

  ButtonImageGadget(#GADGET_Color, 400, 10, 50, 50, ImageID(#IMAGE_Color))
  
  ButtonGadget(#GADGET_Brush,  400, 100, 50, 25, "Brush",  #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_Brush, #GADGET_Line, #GADGET_Box, #GADGET_Circle, #GADGET_Fill
          EventGadget = EventGadget()
          For Gadget = #GADGET_Brush 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

Re: Demande conseil dessiner sélection 2D

Publié : ven. 13/mai/2016 14:01
par Shadow
Salut Bernie,

Non, c'est pas ça.
Sur Rad-Maker, j'aimerais que l'utilisateur puisse personnaliser la sélection sur le Canvas.

Merci à toi.

Re: Demande conseil dessiner sélection 2D

Publié : ven. 13/mai/2016 14:12
par microdevweb
Juste un conseille, rien ne t'empêche d'utilisé les deux bibliothèques (ne pas les imbriqué c'est tout)

Re: Demande conseil dessiner sélection 2D

Publié : ven. 13/mai/2016 16:30
par Shadow
Dac.

Alors j'ai fais ça, c'est un brouillon, ça marche mais c'est une usine à gaze pour rien.
De plus, je ne gère pas l’épaisseur des point ni leur espace ! (1 et 1 ici)

Il faut que suivant la largeur et la hauteur de la sélection, que celle-ci soit homogène et bien réglé, pour pas avoir
un point à coté de l'autre ou trop loin de l’autre...

Comment faire compliquer quand ont peu faire simple :roll:

Code : Tout sélectionner

Enumeration 1
  #Fenetre
EndEnumeration

Global ImageSelection = 99
CreateImage(ImageSelection, 800, 600, 32, #PB_Image_Transparent)
CopyImage(ImageSelection, ImageSelectionSave)

Procedure DrawSelection(Windows.i, Gadget.i, X.i, Y.i, Largeur.i, Hauteur.i, Couleur.i, Eppaisseur.i, Type.i)
  
  StartDrawing(ImageOutput(ImageSelection))
  
  ; Eface l'image
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  Box(0, 0, Largeur.i, Hauteur.i, RGBA(0, 0, 0, 0))
  
  Reste1 = Largeur - ((Largeur / 2) * 2)
  Debug Reste1
  
  ; Haut
  If Reste1 <> 0
    
    For I = 1 To Largeur Step 2
      Box(I, 0, 1, 1, RGBA(255, 0, 0, 255))
    Next
    
  Else
    
    For I = 0 To Largeur Step 2
      Box(I, 0, 1, 1, RGBA(255, 0, 0, 255))
    Next
    
  EndIf
  
  
  ; Droite
  If Reste1 <> 0
    
    For I = 2 To Hauteur Step 2
      Box(Largeur, I, 1, 1, RGBA(255, 0, 0, 255))
    Next
    
    Reste2 = (Hauteur - 2) - (((Hauteur - 2) / 2) * 2)
    
  Else
    
    For I = 0 To Hauteur Step 2
      Box(Largeur, I, 1, 1, RGBA(255, 0, 0, 255))
    Next
    
    Reste2 = Hauteur - ((Hauteur / 2) * 2)
    
  EndIf
  
  Debug Reste2
  
  ; Bas
  If Reste1 <> 0
    
    If Reste2 <> 0
      
      For I = Largeur - 1 To 0 Step - 2
        Box(I, Hauteur, 1, 1, RGBA(255, 0, 0, 255))
      Next
      
      Reste3 = (Largeur - 1) - (((Largeur - 1) / 2) * 2)
      
    Else
      
      For I = Largeur - 2 To 0 Step - 2
        Box(I, Hauteur, 1, 1, RGBA(255, 0, 0, 255))
      Next
      
      Reste3 = (Largeur - 2) - (((Largeur - 2) / 2) * 2)
      
    EndIf
    
  Else
    
    If Reste2 <> 0
      
      For I = Largeur - 1 To 0 Step - 2
        Box(I, Hauteur, 1, 1, RGBA(255, 0, 0, 255))
      Next
      
      Reste3 = (Largeur - 1) - (((Largeur - 1) / 2) * 2)
      
    Else
      
      For I = Largeur - 2 To 0 Step - 2
        Box(I, Hauteur, 1, 1, RGBA(255, 0, 0, 255))
      Next
      
      Reste3 = (Largeur - 2) - (((Largeur - 2) / 2) * 2)
      
    EndIf
    
  EndIf
  
  Debug Reste3
  
  ; Gauche
  If Reste1 <> 0
    
    If Reste2 <> 0
      
      If Reste3 <> 0
        
        For I = Hauteur - 1 To 0 Step - 2
          Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      Else
        
        For I = Hauteur - 2 To 0 Step - 2
          Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      EndIf
      
    Else
      
      If Reste3 <> 0
        
        For I = Hauteur - 1 To 0 Step - 2
          Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      Else
        
        For I = Hauteur - 1 To 0 Step - 2
          Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      EndIf
      
    EndIf
    
  Else
    
    If Reste2 <> 0
      
      If Reste3 <> 0
        
        For I = Hauteur - 1 To 0 Step - 2
          Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      Else
        
        For I = Hauteur - 1 To 0 Step - 2
          Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      EndIf
      
    Else
      
      If Reste3 <> 0
        
        For I = Hauteur - 1 To 0 Step - 2
          Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      Else
        
        For I = Hauteur - 2 To 0 Step - 2
          Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      EndIf
      
    EndIf
    
  EndIf
  

  StopDrawing()
  
  If IsWindow(Windows)
    StartDrawing(WindowOutput(Windows))
  ElseIf IsGadget(Gadget)
    StartDrawing(CanvasOutput(Gadget))
  EndIf
  
  DrawAlphaImage(ImageID(ImageSelection), 0, 0, 255)
  StopDrawing()
  
EndProcedure

Procedure Ma_Fenetre()
  
  If OpenWindow(#Fenetre, 327, 177, 1000, 800, "Fenetre windows",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
    CanvasGadget(#Fenetre + 1, 1, 1, 798, 598)
    DrawSelection(-1, #Fenetre + 1, 10, 10, 99, 199, RGB(255, 0, 0), 10, 0)

    Repeat ; D part des  v nements de boucle
      
      Event = WaitWindowEvent(1) ; Cette ligne attend pendent (Minuteur) qu'un  v nement soit recus par la fen tre
      
      Select Event 
          
        Case #PB_Event_Gadget
          
          Select EventGadget
              
            Case 0
              
          EndSelect
          
      EndSelect
      
    Until Event = #PB_Event_CloseWindow ; Fin des  v nements de boucle
    
  EndIf
  
EndProcedure

Ma_Fenetre()

Re: Demande conseil dessiner sélection 2D

Publié : ven. 13/mai/2016 16:48
par Bernie
Dans mes archive j'ai retrouver un code de Microdevweb qui permet de dessiner un rectangle et de le deplacer sur le canvas

Code : Tout sélectionner

;**********************************************************************************************************
; Author : MicordevWeb
; Name : EasyDraw
; Date : 2015/10/17
; Version: B 0.1
; Pb: 5.40 lst
;**********************************************************************************************************
EnableExplicit
UseSQLiteDatabase()
Enumeration
      #Font
      #MainForm
      #MainMenu
      #New
      #Open
      #Save
      #SaveAs
      #Close
      #Exit
      #PropertieForm
      #SpW
      #SpH
      #BtSubmit
      #BtChancel
      #ScrollArea
      #Canvas
      #NewBox
      #NewCircle
EndEnumeration
Enumeration
      #ModeSelect
      #MdNewBox
      #MdNewCircle
EndEnumeration
Enumeration
      #ObBox
      #ObCircle
EndEnumeration
Structure Pos
      X.d
      Y.d
      W.d
      H.d
EndStructure
Global myPos.Pos,myOldPos.Pos,UL.Pos,UM.Pos,UR.Pos,
DL.Pos,DM.Pos,DR.Pos,LM.Pos,RM.Pos,newPos.Pos,
gDb,gMotherForm,gModeNew.b,gExt$,gDrawW,gDrawH,
gModeDraw=#ModeSelect,gMouseX,gMouseY,gClicOn.b=#False,
gImgTmp,gActiOn.b,gId=-1,gObj,gCurrentHandle$,gSelected
LoadFont(#Font,"Arial",12,#PB_Font_HighQuality)
Declare OpenDrawPropertie()
Declare CloseForm()
Declare ManageCanvas()
Declare DrawCanvas()
Procedure DbQuey(query$)
      If DatabaseQuery(gDb,query$)=0
            MessageRequester("DbQuey Error",DatabaseError())
            ProcedureReturn #False
      EndIf
      ProcedureReturn #True
EndProcedure
Procedure DbUpdate(query$)
      If DatabaseUpdate(gDb,query$)=0
            MessageRequester("DbUpdate Error",DatabaseError())
            ProcedureReturn #False
      EndIf
      ProcedureReturn #True
EndProcedure
Macro mAddTable(Table)
      query$= "CREATE TABLE "+Table+"("
      For N=0 To ArraySize(Column$(),1)
            If N>0
                  query$+","
            EndIf
            query$+Column$(N,0)+" "+Column$(N,1)
      Next
      query$+")"
      If Not DbUpdate(query$):End:EndIf
EndMacro
Procedure BuildMemorisDb()
      gDb=OpenDatabase(#PB_Any,":memory:","","")
      If gDb=0
            MessageRequester("BuildMemorisDb Error","Can not open DataBase")
            ProcedureReturn #False
      EndIf
      Protected query$,N
      Dim Column$(7,1)
      Column$(0,0)="id":Column$(1,0)="x":Column$(2,0)="y":Column$(3,0)="w":Column$(4,0)="h"
      Column$(5,0)="fgcolor":Column$(6,0)="bgcolor":Column$(7,0)="filled"
      Column$(0,1)="INTEGER PRIMARY KEY"
      For N=1 To 7 :Column$(N,1)="INTEGER":Next
      mAddTable("box")
      mAddTable("circle")
EndProcedure
Procedure NewDraw()
      gModeNew=#True
      OpenDrawPropertie()
      SetActiveGadget(#spW)
EndProcedure
Procedure OpenDraw()
     
EndProcedure
Procedure SaveDraw()
     
EndProcedure
Procedure SaveAsDraw()
     
EndProcedure
Procedure CloseDraw()
     
EndProcedure
Procedure Exit()
      CloseDatabase(gDb)
      End
EndProcedure
Procedure EventResize()
      ManageCanvas()
EndProcedure
Procedure HoverToForm()
      Protected query$
      query$="SELECT * FROM box WHERE (X<="+Str(gMouseX)+" AND "+
             "(X+W)>="+Str(gMouseX)+")"+
             "AND (Y<="+Str(gMouseY)+" AND (Y+H)>="+Str(gMouseY)+")"
      If Not DbQuey(query$):End:EndIf
      gId=-1
      If FirstDatabaseRow(gDb)
            gId=GetDatabaseLong(gDb,0)
            gObj=#ObBox
            ProcedureReturn #True
      EndIf
      ProcedureReturn #False
EndProcedure
Procedure PreDrawBox()
      gActiOn=#True
      With myPos
            \W=gMouseX-\X
            \H=gMouseY-\Y
            StartVectorDrawing(CanvasVectorOutput(#Canvas))
            DrawVectorImage(ImageID(gImgTmp))
            AddPathBox(\X,\Y,\W,\H)   
            VectorSourceColor(RGBA(211,211,211,255))
            DotPath(2,4)
            StopVectorDrawing()
      EndWith
EndProcedure
Procedure AddBox()
      Protected query$
      query$="INSERT INTO box (x,y,w,h,fgcolor,bgcolor) VALUES ("
      With myPos
            query$+Str(\X)+","+Str(\Y)+","+Str(\W)+","+Str(\H)+","+
                   Str(RGBA(0,0,0,255))+","+Str(RGBA(0,0,0,255))+")"
            If Not DbUpdate(query$) :End:EndIf
      EndWith
      gModeDraw=#ModeSelect
      gActiOn=#False
      DrawCanvas()
EndProcedure
Procedure DrawCanvas()
      Protected query$
      StartVectorDrawing(ImageVectorOutput(gImgTmp))
      ; Efface le dessin
      AddPathBox(0,0,ImageWidth(gImgTmp),ImageHeight(gImgTmp))
      VectorSourceColor(RGBA(255,255,255,255))
      FillVectorOutput()
      ;{ Les box
      query$="SELECT * FROM box"
      If Not DbQuey(query$):End:EndIf
      While NextDatabaseRow(gDb)
            AddPathBox(GetDatabaseLong(gDb,1),GetDatabaseLong(gDb,2),GetDatabaseLong(gDb,3),GetDatabaseLong(gDb,4))
            VectorSourceColor(GetDatabaseLong(gDb,5))
            StrokePath(2)
      Wend
      FinishDatabaseQuery(gDb)
      ;}
      StopVectorDrawing()
      StartVectorDrawing(CanvasVectorOutput(#Canvas))
      DrawVectorImage(ImageID(gImgTmp))
      StopVectorDrawing()
EndProcedure
Procedure PreDrawEdit()
      Protected X,Y,W,H,DepX,DepY
      DepX=gMouseX-myPos\X
      DepY=gMouseY-myPos\Y
      Select gObj
            Case #ObBox
                  gActiOn=#True
                  With myOldPos
                        Select gCurrentHandle$
                              Case ""
                                    X=\X+DepX
                                    Y=\Y+DepY
                                    W=\W
                                    H=\H
                              Case "UL"
                                    X=\X+DepX
                                    Y=\Y+DepY
                                    W=\W-DepX
                                    H=\H-DepY
                              Case "UR"
                                    X=\X
                                    Y=\Y+DepY
                                    W=\W+DepX
                                    H=\H-DepY
                              Case "UM"
                                    X=\X
                                    Y=\Y+DepY
                                    W=\W
                                    H=\H-DepY   
                              Case "DL"
                                    X=\X+DepX
                                    Y=\Y
                                    W=\W-DepX
                                    H=\H+DepY   
                              Case "DR"
                                    X=\X
                                    Y=\Y
                                    W=\W+DepX
                                    H=\H+DepY   
                              Case "DM"
                                    X=\X
                                    Y=\Y
                                    W=\W
                                    H=\H+DepY   
                              Case "LM"
                                    X=\X+DepX
                                    Y=\Y
                                    W=\W-DepX
                                    H=\H   
                              Case "RM"
                                    X=\X
                                    Y=\Y
                                    W=\W+DepX
                                    H=\H       
                        EndSelect
                  EndWith
      EndSelect
      StartVectorDrawing(CanvasVectorOutput(#Canvas))
      DrawVectorImage(ImageID(gImgTmp))
      AddPathBox(X,Y,W,H)   
      With  newPos
            \X=X
            \Y=Y
            \W=W
            \H=H
      EndWith
      VectorSourceColor(RGBA(211,211,211,255))
      DotPath(2,4)
      StopVectorDrawing()
EndProcedure
Procedure DrawHandle()
      Protected X,Y,W=8
      StartVectorDrawing(ImageVectorOutput(gImgTmp))
      With myOldPos
            Select gObj
                  Case #ObBox
                        ; Poignée Haut gauche
                        X=\X-(W/2)
                        Y=\Y-(W/2)
                        AddPathBox(X,Y,W,W)
                        UL\X=X
                        UL\Y=Y
                        UL\W=W
                        ; Poignée Haut droite
                        X=(\X+\W)-(W/2)
                        Y=\Y-(W/2)
                        AddPathBox(X,Y,W,W)
                        UR\X=X
                        UR\Y=Y
                        UR\W=W
                        ; Poignée bas gauche
                        X=\X-(W/2)
                        Y=(\Y+\H)-(W/2)
                        AddPathBox(X,Y,W,W)
                        DL\X=X
                        DL\Y=Y
                        DL\W=W
                        ; Poignée Bas droite
                        X=(\X+\W)-(W/2)
                        Y=(\Y+\H)-(W/2)
                        AddPathBox(X,Y,W,W)
                        DR\X=X
                        DR\Y=Y
                        DR\W=W
                        ; Poignée milieu gauche
                        X=\X-(W/2)
                        Y=(\Y+(\H/2))-(W/2)
                        AddPathBox(X,Y,W,W)
                        LM\X=X
                        LM\Y=Y
                        LM\W=W
                        ; Poignée Milieu droite
                        X=(\X+\W)-(W/2)
                        Y=(\Y+(\H/2))-(W/2)
                        AddPathBox(X,Y,W,W)
                        RM\X=X
                        RM\Y=Y
                        RM\W=W
                        ; Poignée Haut Milieu
                        X=(\X+(\W/2))-(W/2)
                        Y=\Y-(W/2)
                        AddPathBox(X,Y,W,W)
                        UM\X=X
                        UM\Y=Y
                        UM\W=W
                        ; Poignée bas milieu
                        X=(\X+(\W/2))-(W/2)
                        Y=(\Y+\H)-(W/2)
                        AddPathBox(X,Y,W,W)
                        DM\X=X
                        DM\Y=Y
                        DM\W=W
                        VectorSourceColor(RGBA(105,105,105,255))
                        FillPath()
            EndSelect
      EndWith
      StopVectorDrawing()
      StartVectorDrawing(CanvasVectorOutput(#Canvas))
      DrawVectorImage(ImageID(gImgTmp))
      StopVectorDrawing()
EndProcedure
Procedure HoverHandle()
      With UL
            If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
                  gCurrentHandle$="UL"
                  SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftUpRightDown)
                  ProcedureReturn #True
            EndIf
      EndWith
      With UM
            If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
                  gCurrentHandle$="UM"
                  SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_UpDown)
                  ProcedureReturn #True
            EndIf
      EndWith
      With UR
            If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
                  gCurrentHandle$="UR"
                  SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftDownRightUp)
                  ProcedureReturn #True
            EndIf
      EndWith
      With DL
            If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
                  gCurrentHandle$="DL"
                  SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftDownRightUp)
                  ProcedureReturn #True
            EndIf
      EndWith
      With DM
            If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
                  gCurrentHandle$="DM"
                  SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_UpDown)
                  ProcedureReturn #True
            EndIf
      EndWith
      With DR
            If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
                  gCurrentHandle$="DR"
                  SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftUpRightDown)
                  ProcedureReturn #True
            EndIf
      EndWith
      With LM
            If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
                  gCurrentHandle$="LM"
                  SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftRight)
                  ProcedureReturn #True
            EndIf
      EndWith
      With RM
            If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
                  gCurrentHandle$="RM"
                  SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftRight)
                  ProcedureReturn #True
            EndIf
      EndWith
      gCurrentHandle$=""
      ProcedureReturn #False
EndProcedure
Procedure ChangePosition()
      Protected query$
      With newPos
            Select gObj
                  Case #ObBox
                        query$="UPDATE box SET "+
                               "x="+Str(\X)+",y="+Str(\Y)+",w="+Str(\W)+",h="+Str(\H)
                        myOldPos\X=\X
                        myOldPos\Y=\Y
                        myOldPos\W=\W
                        myOldPos\H=\H
            EndSelect
      EndWith
      If Not DbUpdate(query$):End:EndIf
      DrawCanvas()
      DrawHandle()
EndProcedure
Procedure EventCanvas()
      Select EventType()
            Case #PB_EventType_MouseMove
                  gMouseX=GetGadgetAttribute(#Canvas,#PB_Canvas_MouseX)
                  gMouseY=GetGadgetAttribute(#Canvas,#PB_Canvas_MouseY)
                  Select gModeDraw
                        Case  #MdNewBox,#MdNewCircle   
                              SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_Cross)
                              If gClicOn
                                    PreDrawBox()
                              EndIf
                        Case #ModeSelect 
                              If gId<>-1 And gClicOn
                                    PreDrawEdit()
                              EndIf
                              If Not gClicOn
                                    If HoverHandle()
                                          ProcedureReturn
                                    EndIf
                                    If HoverToForm()
                                          If gSelected
                                                SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_Arrows)
                                          Else
                                                SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_Hand)
                                          EndIf
                                         
                                          ProcedureReturn
                                    EndIf
                                    SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
                              EndIf
                  EndSelect
            Case #PB_EventType_LeftButtonDown
                  If Not gClicOn
                        myPos\X=gMouseX
                        myPos\Y=gMouseY
                        If gId<>-1
                              If gSelected=#True
                                    gActiOn=#True
                              EndIf
                              Select gObj
                                    Case #ObBox
                                          myOldPos\X=GetDatabaseLong(gDb,1)
                                          myOldPos\Y=GetDatabaseLong(gDb,2)
                                          myOldPos\W=GetDatabaseLong(gDb,3)
                                          myOldPos\H=GetDatabaseLong(gDb,4)
                                          DrawHandle()
                                          gSelected=#True
                              EndSelect
                        Else
                              gSelected=#False
                              DrawCanvas()
                        EndIf
                  EndIf
                  gClicOn=#True
            Case #PB_EventType_LeftButtonUp
                  If gActiOn
                        Select gModeDraw
                              Case #MdNewBox
                                    AddBox()
                              Case #ModeSelect
                                    ChangePosition()
                        EndSelect
                  EndIf
                  gClicOn=#False
      EndSelect
EndProcedure
Procedure ManageCanvas()
      UseGadgetList(WindowID(#MainForm))
      If gDrawW>WindowWidth(#MainForm) Or gDrawH>(WindowHeight(#MainForm)-MenuHeight())
            If  IsGadget(#ScrollArea)=0
                  ScrollAreaGadget(#ScrollArea,0,0,WindowWidth(#MainForm),(WindowHeight(#MainForm)-MenuHeight()),
                                   gDrawW,gDrawH,10)
            Else
                  ResizeGadget(#ScrollArea,#PB_Ignore,#PB_Ignore,WindowWidth(#MainForm),(WindowHeight(#MainForm)-MenuHeight()))
                  SetGadgetAttribute(#ScrollArea,#PB_ScrollArea_InnerWidth,gDrawW)
                  SetGadgetAttribute(#ScrollArea,#PB_ScrollArea_InnerHeight,gDrawH)
                  OpenGadgetList(#ScrollArea)
            EndIf
      Else
            If  IsGadget(#ScrollArea)<>0
                  FreeGadget(#ScrollArea)
            EndIf
      EndIf
      If IsGadget(#Canvas)=0
            CanvasGadget(#Canvas,0,0,gDrawW,gDrawH,#PB_Canvas_Keyboard)
            gImgTmp=CreateImage(#PB_Any,gDrawW,gDrawH)
            StartDrawing(ImageOutput(gImgTmp))
            Box(0,0,ImageWidth(gImgTmp),ImageHeight(gImgTmp),$FFFFFF)
            StopDrawing()
            BindGadgetEvent(#Canvas,@EventCanvas())
      Else
            ResizeGadget(#Canvas,#PB_Ignore,#PB_Ignore,gDrawW,gDrawH)
            ResizeImage(gImgTmp,gDrawW,gDrawH)
      EndIf
      If IsGadget(#ScrollArea)<>0
            CloseGadgetList()
      EndIf
EndProcedure
Procedure SavePropertie()
      gDrawW=GetGadgetState(#spW)
      gDrawH=GetGadgetState(#spH)
      CloseForm()
      ManageCanvas()
EndProcedure
Procedure CloseForm()
      If gMotherForm<>-1
            DisableWindow(gMotherForm,#False)
      EndIf
      CloseWindow(EventWindow())
EndProcedure
Procedure OpenDrawPropertie()
      Protected title$
      Protected M=10,X=M,Y=M,W=180,H=30
      Protected WF=(W*1)+(M*2),HF=(H*5)+(M*4)
      Protected Flag=#PB_Window_ScreenCentered|#PB_Window_SystemMenu
      Protected tmp
      gExt$=" pxl"
      If gModeNew
            title$="Nouveau document"
      Else
            title$="Propriété du document"
      EndIf
      gMotherForm=#MainForm
      DisableWindow(gMotherForm,#True)
      OpenWindow(#PropertieForm,0,0,WF,HF,title$,Flag,WindowID(#MainForm))
      tmp=TextGadget(#PB_Any,X,Y,W,H,"Largeur:")
      SetGadgetFont(tmp,FontID(#Font))
      Y+H
      SpinGadget(#spW,X,Y,W,H,0,2500,#PB_Spin_Numeric)
      SetGadgetFont(#spW,FontID(#Font))
      Y+H+M
      tmp=TextGadget(#PB_Any,X,Y,W,H,"Hauteur:")
      SetGadgetFont(tmp,FontID(#Font))
      Y+H
      SpinGadget(#spH,X,Y,W,H,0,2500,#PB_Spin_Numeric)
      SetGadgetFont(#spH,FontID(#Font))
      Y+H+M
      W=(W/2)-M
      ButtonGadget(#BtSubmit,X,Y,W,H,"Valider")
      SetGadgetFont(#BtSubmit,FontID(#Font))
      BindGadgetEvent(#BtSubmit,@SavePropertie())
      X+W+M
      ButtonGadget(#BtChancel,X,Y,W,H,"Annuler")
      SetGadgetFont(#BtChancel,FontID(#Font))
      BindGadgetEvent(#BtChancel,@CloseForm())
      BindEvent(#PB_Event_CloseWindow,@CloseForm(),#PropertieForm)
EndProcedure
Procedure NewBox()
      gActiOn=#False
      gModeDraw=#MdNewBox
EndProcedure
Procedure OpenMainForm()
      Protected Flag=#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_Maximize|#PB_Window_MaximizeGadget
      Flag|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget
      OpenWindow(#MainForm,0,0,800,600,"Easy Draw",Flag)
      CreateMenu(#MainMenu,WindowID(#MainForm))
      MenuTitle("Fichier")
      MenuItem(#New,"Nouveau "+Chr(9)+"ALT N")
      AddKeyboardShortcut(#MainForm,#PB_Shortcut_Alt|#PB_Shortcut_N,#New)
      BindMenuEvent(#MainMenu,#New,@NewDraw())
      MenuItem(#Open,"Ouvrir "+Chr(9)+"ALT O")
      AddKeyboardShortcut(#MainForm,#PB_Shortcut_Alt|#PB_Shortcut_N,#Open)
      BindMenuEvent(#MainMenu,#Open,@OpenDraw())
      MenuItem(#Save,"Sauver "+Chr(9)+"CTRL S")
      AddKeyboardShortcut(#MainForm,#PB_Shortcut_Control|#PB_Shortcut_N,#Save)
      BindMenuEvent(#MainMenu,#Save,@SaveDraw())
      MenuItem(#SaveAs,"Sauver sous ")
      BindMenuEvent(#MainMenu,#SaveAs,@SaveAsDraw())
      MenuItem(#Close,"Fermer ")
      BindMenuEvent(#MainMenu,#Close,@CloseDraw())
      MenuBar()
      MenuItem(#Exit,"Quitter ")
      BindMenuEvent(#MainMenu,#Exit,@Exit())
      MenuTitle("Nouvelle forme")
      MenuItem(#NewBox,"Rectangle "+Chr(9)+"ALT B")
      AddKeyboardShortcut(#MainForm,#PB_Shortcut_Alt|#PB_Shortcut_B,#NewBox)
      BindMenuEvent(#MainMenu,#NewBox,@NewBox())
      BindEvent(#PB_Event_CloseWindow,@Exit(),#MainForm)
      BindEvent(#PB_Event_SizeWindow,@EventResize(),#MainForm)
EndProcedure
BuildMemorisDb()
OpenMainForm()
gDrawW=WindowWidth(#MainForm)
gDrawH=WindowHeight(#MainForm)-MenuHeight()
ManageCanvas()
Global gEvent
Repeat:gEvent=WaitWindowEvent():ForEver

Re: Demande conseil dessiner sélection 2D

Publié : ven. 13/mai/2016 17:09
par Shadow
Belle exemple mais va être dure de comprendre le code :|
Bien que cet exemple va m’être utile plus tard pour mon Rad, ici non.

Merci Bernie, Micro.

Re: Demande conseil dessiner sélection 2D

Publié : ven. 13/mai/2016 17:57
par Bernie
Shadow a écrit :Belle exemple mais va être dure de comprendre le code :|
Bien que cet exemple va m’être utile plus tard pour mon Rad, ici non.

Merci Bernie, Micro.
de rien

Re: Demande conseil dessiner sélection 2D

Publié : ven. 13/mai/2016 19:46
par microdevweb
Honnêtement Shadow, je comprend pas ton code 200 lgn pour afficher un rectangle? Que cherches tu réellement à faire?

Re: Demande conseil dessiner sélection 2D

Publié : ven. 13/mai/2016 20:29
par Shadow
Une sélection que diable, une sélection, pour mon Rad !

Re: Demande conseil dessiner sélection 2D

Publié : sam. 14/mai/2016 13:36
par blendman
c'est ça que tu veux ?

Code : Tout sélectionner


Enumeration 
    
    #Fenetre =0
    ; gadgets    
    #Canvas = 0
    
EndEnumeration

Procedure UpdateDraw(Gad.i, X.i, Y.i, w.i, h.i)
    
    
    
    
    If StartVectorDrawing(CanvasVectorOutput(Gad))
        
        ; Eface l'image       
        AddPathBox(0, 0, GadgetWidth(Gad),GadgetHeight(Gad))
        VectorSourceColor(RGBA(0, 0, 0, 0))
        FillPath()
        
        ; on dessine un fond si besoin
        AddPathBox(0, 0, GadgetWidth(Gad),GadgetHeight(Gad))
        VectorSourceColor(RGBA(180,180,180,255))
        FillPath()
        
        ; on dessine des trucs (tes autres objets)
                
        
        ; puis on dessine le cadre sélection
        AddPathBox(x, y, w, h)
        VectorSourceColor(RGBA(255, 0, 0, 255))
        DashPath(1,5)
                
        StopVectorDrawing()
        
    EndIf
    
EndProcedure

Procedure Ma_Fenetre()
    
    If OpenWindow(#Fenetre, 0, 0, 1200, 800, "Fenetre windows",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
        
        CanvasGadget(#Canvas, 0, 0, 800, 600)
        UpdateDraw(#Canvas, 10, 10, 99, 199)
        
        Repeat ; D part des  v nements de boucle
            
            Event = WaitWindowEvent(1) ; Cette ligne attend pendent (Minuteur) qu'un  v nement soit recus par la fen tre
            
            Select Event
                    
                Case #PB_Event_Gadget
                    
                    Select EventGadget
                            
                        Case 0
                            If EventType() = #PB_EventType_LeftButtonDown                                 
                                x = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
                                y = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
                                UpdateDraw(#CAnvas, x,y,0,0)
                            ElseIf  (EventType() = #PB_EventType_MouseMove And 
                                                              GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
                                x1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
                                y1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
                                w = x1-x
                                h = y1-y
                                UpdateDraw(#Canvas, x,y,w,h)
                            EndIf
                                                        
                    EndSelect
                    
            EndSelect
            
        Until Event = #PB_Event_CloseWindow ; Fin des  v nements de boucle
        
    EndIf
    
EndProcedure

Ma_Fenetre()

Re: Demande conseil dessiner sélection 2D

Publié : sam. 14/mai/2016 14:03
par Shadow
Mais c'est magnifique ça blendman :D
Oui c'est ça que je veux !
Milles merci !

Edit, ha bha non en faite :cry:
C'était trop beau pour être vraie snif.

En faite c'est ça que je veux oui mais
je veux faire ça avec la bibliothèque classique 2D.

Pourquoi, dis-tu ?
Parce que le soucis avec la bibliothèque Vector
c'est qu’on peut pas faire 1 d’épaisseur :cry:

C'est flou sinon et j'aime pas ça et je veux pas ça.
C'est le seule soucis avec cette superbe lib pour moi.

Merci quand même :)

Re: Demande conseil dessiner sélection 2D

Publié : sam. 14/mai/2016 15:17
par blendman
Pour windows, tu as ça :

Code : Tout sélectionner

Enumeration
   
    #Fenetre =0
    ; gadgets   
    #Canvas = 0
   
EndEnumeration



Procedure DrawSelector( Window,MouseX,MouseY,State=2,Pen =3,PenColor =$E2B256 )
    
    ; code by mestnyi
    
    
    ; changer le State pour voir les différent points tillés
    
    Static .i lastX, lastY, MoveMouseX, MoveMouseY
    Protected hDC
    If State
        hDC = StartDrawing(WindowOutput(Window))
        If hDC
            DrawingMode(#PB_2DDrawing_XOr|#PB_2DDrawing_Outlined)
            SetBkMode_(hDC, #TRANSPARENT)
            Protected hPen = CreatePen_(Pen, 0, PenColor);
            Protected hPenold = SelectObject_(hDC, hPen) ;
            
            Rectangle_(hDC, lastX, lastY, MoveMouseX, MoveMouseY)
            lastX = MouseX :MoveMouseX = WindowMouseX(Window)
            lastY = MouseY :MoveMouseY = WindowMouseY(Window)
            Rectangle_(hDC, lastX, lastY, MoveMouseX, MoveMouseY)
            
            StopDrawing()
           
            ProcedureReturn State
        EndIf
    EndIf
EndProcedure

Procedure UpdateDraw(Gad.i, X.i, Y.i, w.i, h.i)
   
    If StartDrawing(CanvasOutput(Gad))
       
        ; Eface l'image       
        ; Box(0, 0, GadgetWidth(Gad),GadgetHeight(Gad), RGBA(0, 0, 0, 0))
       
        ; on dessine un fond si besoin
        Box(0, 0, GadgetWidth(Gad),GadgetHeight(Gad),RGBA(180,180,180,255))
       
        ; on dessine des trucs (tes autres objets)
               
       
        ; puis on dessine le cadre sélection
        DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
        Box(x, y, w, h,RGBA(255, 0, 0, 255))
       
               
        StopDrawing()
       
    EndIf
   
EndProcedure

Procedure Ma_Fenetre()
   
    If OpenWindow(#Fenetre, 0, 0, 1200, 800, "Fenetre windows",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
       
        CanvasGadget(#Canvas, 0, 0, 800, 600)
        ; UpdateDraw(#Canvas, 10, 10, 99, 199)
       
        Repeat ; D part des  v nements de boucle
           
            Event = WaitWindowEvent(1) ; Cette ligne attend pendent (Minuteur) qu'un  v nement soit recus par la fen tre
           
            Select Event
                   
                Case #PB_Event_Gadget
                   
                    Select EventGadget
                           
                        Case 0
                            If EventType() = #PB_EventType_LeftButtonDown                                 
                                x = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
                                y = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
                                ;UpdateDraw(#CAnvas, x,y,0,0)
                                DrawSelector( #Fenetre,X,Y)
                            ElseIf  (EventType() = #PB_EventType_MouseMove And
                                                              GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
                                x1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
                                y1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
                                w = x1-x
                                h = y1-y
                                ;UpdateDraw(#Canvas, x,y,w,h)
                                DrawSelector( #Fenetre,X,Y,1,2,RGB(255,0,0))
                            EndIf
                                                       
                    EndSelect
                   
            EndSelect
           
        Until Event = #PB_Event_CloseWindow ; Fin des  v nements de boucle
       
    EndIf
   
EndProcedure

Ma_Fenetre()

Sinon, tu peux utiliser la procédure UpdateDraw(Gad.i, X.i, Y.i, w.i, h.i) (fonctionne avec la lib 2D normal).

Re: Demande conseil dessiner sélection 2D

Publié : sam. 14/mai/2016 15:31
par Shadow
Merci blendman, mais ça ne me conviens pas non plus :(
J'vé essayer de faire ça en 2d classique pour avoir un max de contrôle sur la sélection.

Re: Demande conseil dessiner sélection 2D

Publié : sam. 14/mai/2016 16:40
par Shadow
Voilà le premier Jet, c'est opérationnel pour des petit points.
J'aimerais savoir comment optimiser un max la procédure sélection svp :)

Comment ferriez vous, vous ?

Code : Tout sélectionner

Procedure DrawSelection(X.i, Y.i, Largeur.i, Hauteur.i, Couleur.i, Eppaisseur.i, Type.i)

  Reste1 = Largeur - ((Largeur / 2) * 2)
  
  ; Haut
  
  For I = 0 To Largeur Step 2
    Box(X + I, Y, 1, 1, RGBA(255, 0, 0, 255))
  Next
  
  ; Droite
  If Reste1 <> 0
    
    For I = 1 To Hauteur Step 2
      Box(X + Largeur, I + Y, 1, 1, RGBA(255, 0, 0, 255))
    Next
    
    Reste2 = Hauteur - ((Hauteur / 2) * 2)
    
  Else
    
    For I = 0 To Hauteur Step 2
      Box(X + Largeur, I + Y, 1, 1, RGBA(255, 0, 0, 255))
    Next
    
    Reste2 = Hauteur - ((Hauteur / 2) * 2)
    
  EndIf
  
  ; Bas
  If Reste1 <> 0
    
    If Reste2 <> 0
      
      For I = Largeur - 2 To 0 Step - 2
        Box(X + I, Hauteur + Y, 1, 1, RGBA(255, 0, 0, 255))
      Next
      
      Reste3 = (Largeur - 2) - (((Largeur - 2) / 2) * 2)
      
    Else
      
      For I = Largeur - 1 To 0 Step - 2
        Box(X + I, Hauteur + Y, 1, 1, RGBA(255, 0, 0, 255))
      Next
      
      Reste3 = (Largeur - 1) - (((Largeur - 1) / 2) * 2)
      
    EndIf
    
  Else
    
    If Reste2 <> 0
      
      For I = Largeur - 1 To 0 Step - 2
        Box(X + I, Hauteur + Y, 1, 1, RGBA(255, 0, 0, 255))
      Next
      
      Reste3 = (Largeur - 1) - (((Largeur - 1) / 2) * 2)
      
    Else
      
      For I = Largeur - 2 To 0 Step - 2
        Box(X + I, Hauteur + Y, 1, 1, RGBA(255, 0, 0, 255))
      Next
      
      Reste3 = (Largeur - 2) - (((Largeur - 2) / 2) * 2)
      
    EndIf
    
  EndIf
  
  ; Gauche
  If Reste1 <> 0
    
    If Reste2 <> 0
      
      If Reste3 <> 0
        
        For I = Hauteur - 1 To 0 Step - 2
          Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      Else
        
        For I = Hauteur - 2 To 0 Step - 2
          Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      EndIf
      
    Else
      
      If Reste3 <> 0
        
        For I = Hauteur - 1 To 0 Step - 2
          Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      Else
        
        For I = Hauteur - 2 To 0 Step - 2
          Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      EndIf
      
    EndIf
    
  Else
    
    If Reste2 <> 0
      
      For I = Hauteur - 1 To 0 Step - 2
        Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
      Next
      
    Else
      
      If Reste3 <> 0
        
        For I = Hauteur - 1 To 0 Step - 2
          Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      Else
        
        For I = Hauteur - 2 To 0 Step - 2
          Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
        Next
        
      EndIf
      
    EndIf
    
  EndIf
  
EndProcedure

Enumeration
  
  #Fenetre 
  #Canvas
  
EndEnumeration

Procedure Ma_Fenetre()
  
  If OpenWindow(#Fenetre, 0, 0, 1200, 800, "Fenetre windows",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
    CanvasGadget(#Canvas, 0, 0, 800, 600)

    Repeat
      
      Event = WaitWindowEvent(1)
      EventGadget = EventGadget()
      
      Select Event
          
        Case #PB_Event_Gadget
          
          Select EventGadget
              
            Case #Canvas
              
              If EventType() = #PB_EventType_LeftButtonDown    
                
                X.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
                Y.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
                
              ElseIf (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
                
                x1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
                y1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
                
                Largeur.i = x1-x
                Hauteur.i = y1-y
                
                Couleur.i = RGB(255, 0, 0)
                
                StartDrawing(CanvasOutput(#Canvas))
                Box(0, 0, GadgetWidth(#Canvas), GadgetHeight(#Canvas), RGB(255, 255, 255))
                DrawSelection(X.i-2, Y.i-2, Largeur.i, Hauteur.i, Couleur.i, Eppaisseur.i, Type.i)
                StopDrawing()
                
              EndIf
              
            Default
              Debug EventGadget
              
          EndSelect
          
      EndSelect
      
    Until Event = #PB_Event_CloseWindow
    
  EndIf
  
EndProcedure

Ma_Fenetre()