PureBasic
https://www.purebasic.fr/french/

[TUTO] Déplacer plusieurs objets dans un canvas
https://www.purebasic.fr/french/viewtopic.php?f=21&t=16016
Page 1 sur 1

Auteur:  microdevweb [ Mer 11/Mai/2016 13:11 ]
Sujet du message:  [TUTO] Déplacer plusieurs objets dans un canvas

Maintenez ALT + clique gauche pour une sélection multiple

Code:
#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

Auteur:  Shadow [ Mer 11/Mai/2016 13:43 ]
Sujet du message:  Re: [TUTO] Déplacer plusieurs objets dans un canvas

Salut,

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

Merci.

Auteur:  Micoute [ Mer 11/Mai/2016 14:00 ]
Sujet du message:  Re: [TUTO] Déplacer plusieurs objets dans un canvas

@Shadow Tu as bien compris l'énoncé ?

@microdevweb Merci pour le partage !

Auteur:  Bernie [ Mer 11/Mai/2016 14:22 ]
Sujet du message:  Re: [TUTO] Déplacer plusieurs objets dans un canvas

Bonjour
ça veux dire quoi l'aerobase devant Exit? merci

Citation:
@Exit()

Auteur:  microdevweb [ Mer 11/Mai/2016 14:45 ]
Sujet du message:  Re: [TUTO] Déplacer plusieurs objets dans un canvas

@Bernie,

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

Certaines fonctions de PureBasic entre autre.

Code:
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.

Auteur:  Bernie [ Mer 11/Mai/2016 16:09 ]
Sujet du message:  Re: [TUTO] Déplacer plusieurs objets dans un canvas

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:
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++ ?

Auteur:  Shadow [ Mer 11/Mai/2016 16:43 ]
Sujet du message:  Re: [TUTO] Déplacer plusieurs objets dans un canvas

Ah oui ça fonctionne merci ^^

Auteur:  microdevweb [ Jeu 12/Mai/2016 5:51 ]
Sujet du message:  Re: [TUTO] Déplacer plusieurs objets dans un canvas

@Bernie,

Oui c'est en effet un pointeur.

Auteur:  Kwai chang caine [ Sam 14/Mai/2016 15:56 ]
Sujet du message:  Re: [TUTO] Déplacer plusieurs objets dans un canvas

Marche niquel
Merci du partage 8)

Page 1 sur 1 Heures au format UTC + 1 heure
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/