IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Déplacement de shapes contenues dans des 'list of shape' à la souris


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2015
    Messages : 2
    Par défaut Déplacement de shapes contenues dans des 'list of shape' à la souris
    Bonjour

    je suis en train développer la partie graphique ("paint" si on veut) d'une application sous VB.NET avec Visual Studio 2010. Elle permet de réaliser des shapes (lignes/cercles/rectangles) dans une picturebox. Comme on ne peut pas s'amuser à déclarer 1000 shapes en espérant que l'utilisateur n'en dessinera pas plus, j'ai declaré une shape temporaire pour chaque type (lignes/cercles/rectangles) qui sera stockée dans une collection de shapes (List of Shape) à chaque fois qu'on termine de dessiner une shape. Ainsi, je peux aller m'adresser (par exemple) au troisième rectangles de la collection de rectangleshapes...etc.

    Mon problème est que j'aimerais pouvoir déplacer ces shapes à la souris, et je n'y arrive pas. J'utilise les événements mousedown/mousemove/mouseup pour dessiner mes shapes mais ces événements sont incompatibles avec mes collections de shapes.

    Y aurait-il moyen, lorsque l'on clique sur une shape, de reconnaitre le type de shape ainsi que son index à l'interieur de la collection? Si cet événement est possible, je pourrais faire en sorte que la shape concernée suive le curseur.

    Demandez moi les parties de mon code que vous voulez si besoin, j’essaierai de vous trier ce qui vous intéresse.

    PS : Je n'ai pas énormément d'experience en VB.NET

    Merci pour votre aide

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 29
    Par défaut
    Bonjour,
    A mon avis, si les Shapes se retrouvent sous forme d'image dans un PictureBox, cela va être quasiment impossible de retrouver la référence de la shape en cliquant sur la PictureBox.
    L'utilisation d'une PictureBox est elle impérative ?
    Si non, je ferais celà :
    1°) Créer un panel qui contiendra les Shapes, ainsi qu'un ShapeContainer dont le Parent sera la panel.
    2°) Créer dynamiquement les shapes dans le container, en spécifiant dans le Tag de la shape son type et son N° dans le type. Du texte fera l'affaire (ex "Rectangle___00001"). Chaque Shape sera rangé dans un tableau (ex Dim ShRectangle_Array() as RectangleShape)
    3°) Pour éviter de faire croitre inutilement le nombre de shapes d'un type, associer un tableau des shapes utilisées par type (Dim ListeRectanglesUtilisés() as Boolean)
    4°) Quand on clic sur une shape (event clic), récupérer le TAG du sender, et ainsi retrouver son type et son N°
    5°) Si on supprime une shape, il suffit de faire ShRectangle_Array(N° de shape extrait).Parent=Nothing et de positionner ListeRectanglesUtilisés(N) en question)=False.
    6°) lors de la création suivante on récupèrera on cherchera une entrée inutilisée de la table ListeRectanglesUtilisés.

    Pour chaque Shape d'un même type, il faudra gérer les événements MouseDown et MouseMove à minima.
    Après MouseMove ou suppression d'une Shape, je pense qu'il faut faire un Refresh du panel contenant ...le container.

    Cela répond-t-il à la question? Ai je été clair ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2015
    Messages : 2
    Par défaut
    Je suis malheureusement obligé d'utiliser une picturebox pour l'instant, mais nos idées se rejoignent sur le shape container (j'en utilise un, que j'ai appelé 'canvas', voir code ci-dessous).

    Je suis intéressé par le fait de récuperer le TAG du sender lorsque l'on clique sur une shape, mais le problème est toujours là : comment reconnaitre qu'on clique sur une shape? Mes shape font parties de listes qui m’empêchent de les atteindre avec les événements, c'est ce genre d'événements dont le receveur peut-être dans une liste qui réglerait mon problème.


    J'ai trié mon code pour vous partager les parties concernées, peut-être cela vous aidera à comprendre comment je procède :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
        Private Sub DmdPictureBox_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DmdPictureBox.MouseDown
            down = True ' checks if the mouse button is pressed
            canvas.Parent = Me  ' Set the form as the parent of the ShapeContainer
     
            If LineChoice = True Then 'Entered if you clicked Draw Line
                TempLine = New LineShape ' Set the shape of the form as a line
                TempLine.Parent = canvas ' Set the ShapeContainer as the parent of the LineShape
                TempLine.Parent.Parent = DmdPictureBox
                TempLine.BorderColor = Color.Black 'indicates the border color to use
                TempLine.BorderStyle = Drawing2D.DashStyle.Solid 'indicates the way to use the border color (solid)
                ptA = New Point(e.X, e.Y) 'Gets the cursor's x and y position and register it as a starting point
                TempLine.StartPoint = ptA 'sets the starting point
                TempLine.EndPoint = ptA 'set the ending point which doesn't exit yet because we still haven't moved or released the mouse button -->Next sub
                TempLine.BorderWidth = linesize
            ElseIf RectangleChoice = True Then 'Entered if you chose Draw Rectangle, only the different lines will be explaine
                ptA = New Point(e.X, e.Y)
                TempRectangle = New RectangleShape
                TempRectangle.Parent = canvas
                TempRectangle.Parent.Parent = DmdPictureBox
                TempRectangle.BorderColor = Color.Black
                TempRectangle.BackColor = Color.Black 'indicates the backcolor to use
                TempRectangle.BackStyle = PowerPacks.BackStyle.Opaque 'indicates the way to use the backcolor (opaque so that it's not transparent)
                TempRectangle.BorderStyle = Drawing2D.DashStyle.Solid
                TempRectangleX1 = e.X 'sets the x coordinate or the cursor as the top left x coordinate of the rectangle
                TempRectangleY1 = e.Y 'set the y coordinate of the cursor as the top left y coordinate of the rectangle
            ElseIf OvalChoice = True Then 'Entered if you chose Draw Oval, , only the different lines will be explained
                TempOval = New OvalShape
                TempOval.Parent = canvas
                TempOval.Parent.Parent = DmdPictureBox
                TempOval.BorderColor = Color.Black
                TempOval.BackColor = Color.Black
                TempOval.BackStyle = PowerPacks.BackStyle.Opaque
                TempOval.BorderStyle = Drawing2D.DashStyle.Solid
                ptA = New Point(e.X, e.Y) 'set the location where the clicked was made as the top left point of the oval (basically his position)
                TempOvalX1 = e.X 'will be used in a calculation later
                TempOvalY1 = e.Y 'will be used in a calculation later
            End If
        End Sub
     
     Private Sub DmdPictureBox_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DmdPictureBox.MouseMove
            If down = True Then 'Needs the mouse button to be pressed
                If LineChoice = True Then
                    TempLine.X2 = e.X 'this line and the following one make the coordinates of the ending point follow the coordinates of the cursor while it's moving
                    TempLine.Y2 = e.Y 'see line above
                ElseIf RectangleChoice = True Then
                    TempRectangleX2 = e.X 'this line and the following one make the coordinates of the bottom right of the rectangle follow the coordinates of the cursor while it's moving
                    TempRectangleY2 = e.Y 'see line above
                    TempRectangle.Location = ptA 'needed so that the program remembers the starting point (location of the rectangle) while moving the ending point (bottom right point)
                    TempRectangle.Width = TempRectangleX2 - TempRectangleX1 'calculates the width of the rectangle by substracting the ending point x coordinates to the starting point x coordinate
                    TempRectangle.Height = TempRectangleY2 - TempRectangleY1 'calculates the height of the rectangle by substracting the ending point y coordinates to the starting point y coordinate
                ElseIf OvalChoice = True Then
                    TempOvalX2 = e.X 'this line and the following one make the coordinates of the bottom right of the oval follow the coordinates of the cursor while it's moving
                    TempOvalY2 = e.Y 'see line above
                    TempOval.Width = TempOvalX2 - TempOvalX1 'calculates the width of the oval by substracting the ending point x coordinates to the starting point x coordinate
                    TempOval.Height = TempOvalY2 - TempOvalY1 'calculates the width of the oval by substracting the ending point x coordinates to the starting point x coordinate
                    TempOval.Location = New Point(ptA) 'needed so that the program remembers the starting point (location of the oval) while moving the ending point (bottom right point)
                    TempOval.Size = New System.Drawing.Size(TempOval.Width, TempOval.Height) 'receives the result of the calcultions above (width and height) and shows the resulting oval
                End If
            End If
        End Sub
        Private Sub DmdPictureBox_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DmdPictureBox.MouseUp
            down = False 'checks if the mouse button isn't pressed
     
            If LineChoice = True Then
                ptB = New Point(e.X, e.Y) 'set the x and y coordinates of the cursor as the x and y coordinates of the line ending point
                lines.Add(TempLine)
                LineCounter = LineCounter + 1
            ElseIf RectangleChoice = True Then
                TempRectangleX2 = e.X 'sets the x coordinate of the cursor as the bottom right x coordinate of the rectangle
                TempRectangleY2 = e.Y 'sets the y coordinate of the cursor as the bottom right y coordinate of the rectangle
                rectangles.Add(TempRectangle)
                RectangleCounter = RectangleCounter + 1
            ElseIf OvalChoice = True Then
                TempOvalX2 = e.X 'sets the x coordinate of the cursor as the bottom right x coordinate of the oval
                TempOvalY2 = e.Y 'sets the x coordinate of the cursor as the bottom right y coordinate of the oval
                ovals.Add(TempOval)
                OvalCounter = OvalCounter + 1
            End If
        End Sub

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 29
    Par défaut
    Au vu du code, canvas (ShapeContainer) a pour Parent la PictureBox qui est utilisé comme le panel dont je parlais plus haut.
    Il faut donc s'en tenir à un tableau des Lines (idems autres types de formes) et l'interfacer avec la liste (en première approche, il s'agirait d'une ListBox, mais je n'en comprends pas l'utilisation).
    Lors de chaque création de ligne, il faut lui ajouter :
    un Tag de Type String et de forme tttnnnnnn avec ttt= "RCT" ou "LIN" ou "OVL" et nnnnnn représente le N° de la forme pour le type
    Les Handlers (AddHandler) de gestion des événements MouseDown et MouseMove pour traiter chaque Shape

    Ecrire les Sub de traitement des événements MouseDown (dans lequel on extrait de sender.Tag le type et le N° de la forme), et MouseMove pour déplacement (par exemple) de la shape.
    Cordialement

Discussions similaires

  1. [SP-2007] Extraire des fichiers Excel ou Csv contenu dans une liste sharepoint
    Par stardeus dans le forum SharePoint
    Réponses: 23
    Dernier message: 03/11/2010, 15h11
  2. Utilisation Des Données Contenues Dans Une Liste
    Par Sniffle dans le forum Général Python
    Réponses: 6
    Dernier message: 10/03/2009, 16h41
  3. Réponses: 3
    Dernier message: 18/09/2007, 12h13
  4. Réponses: 2
    Dernier message: 17/03/2007, 23h38
  5. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo