Creation d'une serie de Controls dynamiquement

Résolu
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 - 26 janv. 2012 à 23:40
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 - 29 janv. 2012 à 21:17
Bonjour a tous,


J'aimerais pouvoir ajouter dynamiquement plusieurs PictureBox sur un Panel, puis pouvoir les bouger avec un seul evenement MouseMove en fonction de la PictureBox selectionnee.
Je peux le faire avec un seul PictureBox, mais je ne sais pas comment faire avec plusieurs...

Voila une partie du code:
imgPicture.Image = Image.FromFile(MyOpenFileDialog.FileName)
imgPicture.SizeMode = PictureBoxSizeMode.AutoSize
Panel1.Controls.Add(imgPicture)
AddHandler imgPicture.MouseMove, AddressOf imgPicture_MouseMove


J'ai essaye de passer par un array...
Private imgPicture() As New PictureBox 'Array can not be declare with New
Private imgPicture() As PictureBox 'Dans le code => Image is not a member of System.Array


Je m'y prend peut-etre completement de travers!
Dans quelle direction devrais-je m'orienter?
Merci,

JLuc01

12 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
27 janv. 2012 à 10:39
Bonjour
sur ta form 1 panel
et 1 button
pour déplacer une image sur la panel
clique dessus et tiens la souris appuyée et
bouge l'image


Public Class Form1
    Private xp, yp As Integer

    Private lastmouselocation As New Point

    Private Sub OpenFileDialog1_FileOk(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
        Dim mypic As New PictureBox
        With mypic
            .Image = Image.FromFile(OpenFileDialog1.FileName)
            .Width = .Image.Width
            .Height = .Image.Height
            .Location = New Point(xp, yp)
            xp += .Width
            If xp > Panel1.Width Then
                xp = 1
                yp += .Height
                If yp > Panel1.Height Then
                    MessageBox.Show("your panel is full")
                    Exit Sub
                End If
            End If
            AddHandler mypic.MouseMove, AddressOf mypicmousemove
            AddHandler mypic.MouseDown, AddressOf mypicMouseDown

        End With
        ' listpic.Add(mypic)
        Panel1.Controls.Add(mypic)
    End Sub


    Private Sub Button1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseClick
        OpenFileDialog1.ShowDialog()
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        xp = 1
        yp = 1
        Button1.Location = New Point(1, 1)
        Panel1.Location = New Point(10, Button1.Bottom + 1)
        Panel1.Width = ClientRectangle.Width - 20
        Panel1.Height = Me.Height - Button1.Height
    End Sub

    Private Sub mypicmousemove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Dim pt As New Point
        pt = e.Location
        If e.Button = Windows.Forms.MouseButtons.Left Then
            pt.X = (pt.X + DirectCast(sender, PictureBox).Left) - lastmouselocation.X
            pt.Y = (pt.Y + DirectCast(sender, PictureBox).Top) - lastmouselocation.Y
            DirectCast(sender, PictureBox).Location = pt
            DirectCast(sender, PictureBox).BringToFront()
        End If
    End Sub
    Private Sub mypicMouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        lastmouselocation = e.Location
    End Sub
    
End Class
3
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
29 janv. 2012 à 18:09
tout d'abord
pour coder correctement
clique sur propriété de ton projet
1 onglet compile et modifie le option strict à
on

2 si tu programmes en net alors ne pas utiliser
les fonctions vb6
clique sur propriété de ton projet
onglet réferences et décoche la réference visual basic

ensuite corrige tes fautes
ex le beep c'est en vb6
en net
Console.Beep()

Je ne veux pas sortir de ma Form ou de mon Panel.


tu veux que le control entier soit toujours dans le champs de vision de ta panel

Private Sub lbLabelMouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
      
 Dim pt As New Point
   pt = e.Location
   If e.Button = Windows.Forms.MouseButtons.Left Then
    pt.X = (pt.X + DirectCast(sender, label).Left) - lastmouselocation.X
            pt.Y = (pt.Y + DirectCast(sender, label).Top) - lastmouselocation.Y
     If pt.X < 0 Then
         pt.X = 0
     End If
     If pt.Y < 0 Then
         pt.Y = 0
     End If
     If pt.X > Panel1.Width - DirectCast(sender, label).Width Then
        pt.X = Panel1.Width - DirectCast(sender, label).Width
     End If
   If pt.Y > Panel1.Height - DirectCast(sender, label).Height Then
       pt.Y = Panel1.Height - DirectCast(sender, label).Height
    End If
    DirectCast(sender, label).Location = pt
end sub 
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 janv. 2012 à 08:12
les messages d'erreur sont clairs, pourtant...

tu ne peux pas faire

imgPicture.Image

sur un tableau de PictureBox...
le faire sur un element donné de ton tableau...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
27 janv. 2012 à 19:24
Bonsoir et merci pour vos reponses.

Renfield: il est vrai que je me suis mal explique car j'ai essaye quelquechose de ce genre:
imgPicture.Image(counter)

...mais, l'erreur provenait sans doute d'ailleurs. J'ai surement ete trop bref dans mes explications.

ShayW: ca marche, meme si ce n'est pas parfaitement clair pour moi. Mais, je devrais pouvoir continuer/travailler sur ce point de depart.
Je suis juste surpris qu'on utilise pas de Tableau ou de List pour stocker plusieurs PictureBox.

Encore merci...
Je vais approfondir sur ce bout de code.

JLuc01
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
28 janv. 2012 à 19:59
Salut
Pour ce que tu veux faire actuellement
tu n'as pas besoin de list ou d'array
c'est ta panel qui contient tes picturebox
reste à savoir ce que tu veux faire aprÚs
tu peux déclarer
private mesimages as new list(of picturebox)
 Private Sub OpenFileDialog1_FileOk(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
 Dim mypic As New PictureBox
  With mypic
  'tout le reste 
  End with
  mesimages.add(mypic)

end sub  
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
29 janv. 2012 à 12:02
Salut,

Merci pour cette derniere precision, ce sera une base a creuser.
Le probleme principal quand je fais un petit software, c'est que je le cree au fur et a mesure et que plein d'idees viennent en meme temps, puis apres que choisir..., c'est bien souvent en fonction de mes maigres possibilites en programmation. Comme dirait un pro, fais un cahier des charges avant de commencer (pour pas te disperser...).

Bref, voila ci dessous ton code modifie a mes besoins, mais j'ai des difficultees a garder MyLabel dans une zone bien definies (voir code ci-dessous).
Entre autre, je ne comprends pas pourquoi j'arrive a voir un nombre negatif sur Me.XLabel.Text = CStr(pt.X), mais cela ne passe jamais par ma boucle If pt.X < 0 Then Beep()... Probablement un grand classique en programmation (Est-ce relie a la methode OnPaint/Paint?).
Le but etant bien sur d'adapter apres le code aux PictureBox.

#Region "Moving Controls"

    Private Sub lbLabelMouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Dim pt As New Point
        pt = e.Location

        If e.Button = Windows.Forms.MouseButtons.Left Then

            If pt.X < 0 Then
                Beep()
            End If

            pt.X = (pt.X + MyLabel.Left) - lastMouseLocation.X
            pt.Y = (pt.Y + MyLabel.Top) - lastMouseLocation.Y

            MyLabel.Location = pt
            MyLabel.BringToFront()

            Me.XLabel.Text = CStr(pt.X)
            Me.YLabel.Text = CStr(pt.Y)

        End If
    End Sub

    Private Sub imgPictureMouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Dim pt As New Point
        pt = e.Location
        If e.Button = Windows.Forms.MouseButtons.Left Then
            pt.X = (pt.X + DirectCast(sender, PictureBox).Left) - lastMouseLocation.X
            pt.Y = (pt.Y + DirectCast(sender, PictureBox).Top) - lastMouseLocation.Y
            DirectCast(sender, PictureBox).Location = pt
            DirectCast(sender, PictureBox).BringToFront()
        End If
    End Sub

    Private Sub objObjectMouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        ' Move objets Label and PictureBox
        lastMouseLocation = e.Location
    End Sub

#End Region


Merci encore pour toute aide ou orientation,
JLuc01
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
29 janv. 2012 à 12:25
Salut

Merci pour cette derniere precision, ce sera une base a creuser.
Le probleme principal quand je fais un petit software, c'est que je le cree au fur et a mesure


on nomme cela le génie logiciel ou software
engineering ici

c'est quoi tes labels ?
comment tu les crées ?
pour chaque picture tu as un label et tu veux
bouger les deux en meme temps c.a.d si
je bouge l'image le label bouge avec ou si
je bouge le label l'image bouge avec ?
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
29 janv. 2012 à 13:04
Bonjour,

En fait, j'ai un seul Label (Titre) et plusieurs PictureBox (Photos).
Ce Label est cree en Design (pas en dynamic, contrairement aux PictureBox).
Je veux bouger simplement les controles (un Label et plusieurs PictureBox) independemment dans une zone definie.
Je ne veux pas sortir de ma Form ou de mon Panel.

Je ne comprend pas pourquoi quand je bouge mon controle, ma boucle "If pt.X < 0 Then ..." n'est pas visitee.
Il y a surement quelquechose qui m'echappe.

JLuc01
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
29 janv. 2012 à 13:33
je n'ai pas compris comment veux tu
1 bouger plusieurs picturebox à la fois
le code d'au dessus te permet de bouger le
picturebox que tu as "mouse down"

2 pt.x et pt.y seront toujours positif pourquoi
c'est la position du curseur dans la form ou
la panel
s'il est négatif cela veut dire qu'il est en dehors du champ de vision du panel ou de de ta form
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
29 janv. 2012 à 13:49
En fait, je veux bouger un control a la fois (Label ou PictureBox) avec l'evenement MouseDown. Et ca marche.

Pour pt.X, il est negatif a un certain moment et je peux le voir avec:
Me.XLabel.Text = CStr(pt.X)

C'est pourquoi, je ne comprends pas lorsque je bouge le control en dehors de la form/panel (curseur aussi en dehors de la form/panel), la boucle suivante n'est pas visitee:
If pt.X < 0 Then
    Beep()
End If

Je peux mettre un point d'arret sur la ligne Beep() et tout marche (pas d'arret), mais je peux promener mon control en dehors de la form/panel (ainsi, on ne le vois plus) ce qui ne devrait pas arriver car pt.X<0.

En esperant que mes explications soient plus claires.

JLuc01
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
29 janv. 2012 à 13:59
Precision: je voudrais que le control reste a la position 0 lorsque pt.X<0, mais de toute facon je n'arrive pas a rentrer dans cette boucle.

If pt.X < 0 Then
    pt.X = 0
End If


JLuc01
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
29 janv. 2012 à 21:17
Genial, ca marche et en plus, j'ai compris le code et la betise que je faisais.

'...code...
If pt.X < 0 Then
      pt.X = 0
End If
pt.X = (pt.X + DirectCast(sender, label).Left) - lastmouselocation.X
pt.Y = (pt.Y + DirectCast(sender, label).Top) - lastmouselocation.Y
'...code...

...au lieu de...
'...code...
pt.X = (pt.X + DirectCast(sender, label).Left) - lastmouselocation.X
pt.Y = (pt.Y + DirectCast(sender, label).Top) - lastmouselocation.Y
If pt.X < 0 Then
      pt.X = 0
End If
'...code...


Pour info, je connais le Option Strict. Cela me corrige pas mal d'erreur.
Et dans le forum, on le repete assez souvent. Mais, cela ne fait pas de mal de le repeter.
Le Beep, c'etait simplement pour un test, mais je ne connaissais pas le Controle.Beep.
Il m'arrive aussi d'utiliser MsgBox au lieu de MessageBox, mais je me corrige quand j'y pense.

De plus,comme j'utilise un seul Label (MyLabel) mis en Design, j'ai remplace "DirectCast(sender, label)." par "MyLabel." et ca marche aussi.
Mais, cette facon de proceder est tres interesante. Je m'en souviendrais.

Encore milles merci, je vais pouvoir continuer mon petit programme.

JLuc01
0
Rejoignez-nous