Page 1 sur 1

[TUTO] Déplacer plusieurs objets dans un canvas

Publié : mer. 11/mai/2016 13:11
par microdevweb
Maintenez ALT + clique gauche pour une sélection multiple

Code : Tout sélectionner

#MainForm=0
#MainCanvas=0
Structure pos
    X.i
    Y.i
    W.i
    H.i
EndStructure
Structure selection Extends pos
    *idObjet
EndStructure
Structure Object
    myPos.pos
    BgColor.i
EndStructure
; La liste des objet
Global NewList myObject.Object()
; La liste qui va retenir les sélections
Global NewMap  mySelection.selection()
; L'objet survolé au début aucun d'ou -1
Global *HoverObject=-1
; La liste des ancienne postion des objet
Procedure MakeObject()
    ; Ici je crée quelque objets
    Protected W=50
    Protected X=W
    With myObject()
        For N=1 To 5
            AddElement(myObject())
            \BgColor=RGB(Random(255,0),Random(255,0),Random(255,0))
            \myPos\Y=W
            \myPos\X=X
            \myPos\W=W
            \myPos\H=W
            X+60
        Next
    EndWith
EndProcedure
Procedure Exit()
    End
EndProcedure
Procedure WhereIsMouse(X,Y)
    With myObject()\myPos
        ; Parcours tous les objets et regarde si sur un 
        ForEach myObject()
            If (X>=\X And X<=(\X+\W)) And (Y>=\Y And Y<=(\Y+\H))
                *HoverObject=@myObject()
                If FindMapElement(mySelection(),Str(@myObject()))<>0
                    SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Arrows)
                Else
                    SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Hand)
                EndIf
                ProcedureReturn #True ; On est sur un objet
            EndIf
        Next
        ProcedureReturn #False ; On est PAS sur un objet
    EndWith
EndProcedure
Procedure Draw()
    StartDrawing(CanvasOutput(#MainCanvas))
    With myObject()
        DrawingMode(#PB_2DDrawing_Default)
        Box(0,0,GadgetWidth(#MainCanvas),GadgetHeight(#MainCanvas),$FFFFFF)
        ForEach myObject()
            DrawingMode(#PB_2DDrawing_Default)
            Box(\myPos\X,\myPos\Y,\myPos\W,\myPos\H,\BgColor)
            ; Reagarde si l'ogjet est sélectionné
            If FindMapElement(mySelection(),Str(@myObject()))<>0
                ; Si oui j'affiche une cadre noir
                DrawingMode(#PB_2DDrawing_Outlined)
                Box(\myPos\X,\myPos\Y,\myPos\W,\myPos\H,$000000)
                Box(\myPos\X+1,\myPos\Y+1,\myPos\W-2,\myPos\H-2,$000000)
                Box(\myPos\X+2,\myPos\Y+2,\myPos\W-4,\myPos\H-4,$000000)
            EndIf
        Next
    EndWith
    StopDrawing()
EndProcedure
Procedure MoveObject(DepX,DepY)
    ForEach mySelection()
        ChangeCurrentElement(myObject(),mySelection()\idObjet)
        With myObject()\myPos
            \X=mySelection()\X+DepX
            \Y=mySelection()\Y+DepY
        EndWith
    Next
    Draw()
EndProcedure
Procedure EventCanvas()
    Static gMouseX,gMouseY,OldMouseX,OldMouseY,ClicOn.b=#False
    Protected DepX,DepY
    Select EventType()
        Case #PB_EventType_MouseMove
            gMouseX=GetGadgetAttribute(#MainCanvas,#PB_Canvas_MouseX)
            gMouseY=GetGadgetAttribute(#MainCanvas,#PB_Canvas_MouseY)
            ; Si pas de clic gauche enfoncé
            *HoverObject=-1 ;Pas sur un objet
            If Not ClicOn
                If Not WhereIsMouse(gMouseX,gMouseY)
                    SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
                EndIf
            Else
                ; Si il y à des objets sélectionés
                If MapSize(mySelection())>0
                    DepX=gMouseX-OldMouseX
                    DepY=gMouseY-OldMouseY
                    MoveObject(DepX,DepY)
                EndIf
            EndIf
        Case #PB_EventType_LeftClick
            ;Si sur un objet
            If *HoverObject<>-1
                ; Regarde si la touche ALT n'est pas enfoncée
                If Not GetGadgetAttribute(#MainCanvas,#PB_Canvas_Modifiers)=#PB_Canvas_Alt
                    ; Je supprime les sélections
                    ClearMap(mySelection())
                EndIf
                ;j'atouche une sélection
                AddMapElement(mySelection(),Str(*HoverObject))
                mySelection()\idObjet=*HoverObject
                ; Pointe sur la liste de l'objet
                ChangeCurrentElement(myObject(),*HoverObject)
                mySelection()\X=myObject()\myPos\X
                mySelection()\Y=myObject()\myPos\Y
            Else ; Clique en dehors des objets je déselectionne tout
                 ; Je supprime les sélections
                ClearMap(mySelection())
            EndIf
            Draw()
        Case #PB_EventType_LeftButtonDown
            ; Si le bt n'est pas enfoncé je mémorise la poisiton de la souris
            If Not ClicOn
                OldMouseX=gMouseX
                OldMouseY=gMouseY
            EndIf
            ClicOn=#True
        Case #PB_EventType_LeftButtonUp
            ClicOn=#False
    EndSelect
EndProcedure
Procedure OpenMainForm()
    flag=#PB_Window_SystemMenu|#PB_Window_Maximize
    OpenWindow(#MainForm,0,0,800,600,"teste",flag)
    CanvasGadget(#MainCanvas,0,0,WindowWidth(#MainForm),WindowHeight(#MainForm),#PB_Canvas_Keyboard)
    ; Crée quelkques objet
    MakeObject()
    ; Dessine les objets
    Draw()
    BindGadgetEvent(#MainCanvas,@EventCanvas())
    BindEvent(#PB_Event_CloseWindow,@Exit())
EndProcedure
OpenMainForm()
Repeat:WaitWindowEvent():ForEver

Re: [TUTO] Déplacer plusieurs objets dans un canvas

Publié : mer. 11/mai/2016 13:43
par Shadow
Salut,

Je ne parviens pas à faire une sélection multiple en essayant ton programme :|
Même avec ALT enfoncé.

Merci.

Re: [TUTO] Déplacer plusieurs objets dans un canvas

Publié : mer. 11/mai/2016 14:00
par Micoute
@Shadow Tu as bien compris l'énoncé ?

@microdevweb Merci pour le partage !

Re: [TUTO] Déplacer plusieurs objets dans un canvas

Publié : mer. 11/mai/2016 14:22
par Bernie
Bonjour
ça veux dire quoi l'aerobase devant Exit? merci
@Exit()

Re: [TUTO] Déplacer plusieurs objets dans un canvas

Publié : mer. 11/mai/2016 14:45
par microdevweb
@Bernie,

L'@ devant un procédure, une liste ou une variable donne l'adresse mémoire.

Certaines fonctions de PureBasic entre autre.

Code : Tout sélectionner

BindEvent
BindGadgetEvent
BindMenuMenuEvent
Demande comme paramètre, l'adresse mémoire d'une procédure qui sera appelée lord de l’événement. Dans le cas que tu demande la procédure Exit, qui sera appelée lord du clique sur l'icone de fermeture de fenêtre.

Re: [TUTO] Déplacer plusieurs objets dans un canvas

Publié : mer. 11/mai/2016 16:09
par Bernie
microdevweb a écrit :@Bernie,

L'@ devant un procédure, une liste ou une variable donne l'adresse mémoire.

Certaines fonctions de PureBasic entre autre.

Code : Tout sélectionner

BindEvent
BindGadgetEvent
BindMenuMenuEvent
Demande comme paramètre, l'adresse mémoire d'une procédure qui sera appelée lord de l’événement. Dans le cas que tu demande la procédure Exit, qui sera appelée lord du clique sur l'icone de fermeture de fenêtre.

merci de ton explication c'est comme un Pointeur en c et c++ ?

Re: [TUTO] Déplacer plusieurs objets dans un canvas

Publié : mer. 11/mai/2016 16:43
par Shadow
Ah oui ça fonctionne merci ^^

Re: [TUTO] Déplacer plusieurs objets dans un canvas

Publié : jeu. 12/mai/2016 5:51
par microdevweb
@Bernie,

Oui c'est en effet un pointeur.

Re: [TUTO] Déplacer plusieurs objets dans un canvas

Publié : sam. 14/mai/2016 15:56
par Kwai chang caine
Marche niquel
Merci du partage 8)