[TUTO] Déplacer plusieurs objets dans un canvas

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

[TUTO] Déplacer plusieurs objets dans un canvas

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

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

Message par Shadow »

Salut,

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

Merci.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message par Micoute »

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

@microdevweb Merci pour le partage !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

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

Message par Bernie »

Bonjour
ça veux dire quoi l'aerobase devant Exit? merci
@Exit()
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message 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.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

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

Message 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++ ?
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

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

Message par Shadow »

Ah oui ça fonctionne merci ^^
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message par microdevweb »

@Bernie,

Oui c'est en effet un pointeur.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message par Kwai chang caine »

Marche niquel
Merci du partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre