PureBasic

Forums PureBasic
Nous sommes le Mer 13/Nov/2019 13:47

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 9 messages ] 
Auteur Message
 Sujet du message: [TUTO] Déplacer plusieurs objets dans un canvas
MessagePosté: Mer 11/Mai/2016 13:11 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1661
Localisation: Belgique
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

_________________
Windows 10 64 bits PB: 5.70 ; 5.71 beta 2


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Déplacer plusieurs objets dans un canvas
MessagePosté: Mer 11/Mai/2016 13:43 
Hors ligne

Inscription: Mer 04/Nov/2015 17:39
Messages: 1025
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Déplacer plusieurs objets dans un canvas
MessagePosté: Mer 11/Mai/2016 14:00 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2202
Localisation: 50200 Coutances
@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 GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Déplacer plusieurs objets dans un canvas
MessagePosté: Mer 11/Mai/2016 14:22 
Hors ligne

Inscription: Mar 22/Mar/2016 10:12
Messages: 282
Localisation: En France
Bonjour
ça veux dire quoi l'aerobase devant Exit? merci

Citation:
@Exit()


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Déplacer plusieurs objets dans un canvas
MessagePosté: Mer 11/Mai/2016 14:45 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1661
Localisation: Belgique
@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.

_________________
Windows 10 64 bits PB: 5.70 ; 5.71 beta 2


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Déplacer plusieurs objets dans un canvas
MessagePosté: Mer 11/Mai/2016 16:09 
Hors ligne

Inscription: Mar 22/Mar/2016 10:12
Messages: 282
Localisation: En France
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++ ?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Déplacer plusieurs objets dans un canvas
MessagePosté: Mer 11/Mai/2016 16:43 
Hors ligne

Inscription: Mer 04/Nov/2015 17:39
Messages: 1025
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Déplacer plusieurs objets dans un canvas
MessagePosté: Jeu 12/Mai/2016 5:51 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1661
Localisation: Belgique
@Bernie,

Oui c'est en effet un pointeur.

_________________
Windows 10 64 bits PB: 5.70 ; 5.71 beta 2


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Déplacer plusieurs objets dans un canvas
MessagePosté: Sam 14/Mai/2016 15:56 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6658
Localisation: Isere
Marche niquel
Merci du partage 8)

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 9 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye