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 :

[vb 2005] 100 picturebox indexés et evenements click


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut [vb 2005] 100 picturebox indexés et evenements click
    Bonjour, c'est mon premier post ici.

    Je fais un puzzle de 100 morceaux provenant d'une image.
    Je suis capable de créer les 100 picturebox du genre mapicture(1) avec ce code.
    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
     
        Dim maPicture(100) As PictureBox
        Dim adresseImage As String = "C:\Users\Public\Pictures\Sample Pictures\Desert Landscape.jpg"
     
        Private Sub InitializePictureBox(ByVal largeur As Integer)
            Dim compte As Integer = 0
            'affichage de l'image complete dans un picturebox généré par vb 2005
            Me.PictureBox1.Image = Image.FromFile(adresseImage)
     
            For large As Integer = 1 To 10
                For haute As Integer = 1 To 10
                    compte = compte + 1
                    maPicture(compte) = New PictureBox
     
                    '  positionnement de chaque  picturebox
                    Me.maPicture(compte).Location = New System.Drawing.Point((largeur * large) + 400, (largeur * haute))
                    Me.maPicture(compte).Size = New System.Drawing.Size(largeur, largeur)
                    Me.maPicture(compte).TabStop = False
                    Me.maPicture(compte).SizeMode = PictureBoxSizeMode.Zoom
                    Me.maPicture(compte).BorderStyle = BorderStyle.None
     
                    ' Ajout du picturebox a la form
                    Me.Controls.Add(Me.maPicture(compte))
     
                    'copy une partie de l'image original dans la picturebox a l'aide d'une function
                    Me.maPicture(compte).Image = ImagePart(Me.PictureBox1.Image, (largeur * large), (largeur * haute), largeur, largeur)
                Next
            Next
            Me.Refresh()
        End Sub
    Tout ce code fonctionne bien.
    Mon problème, c'est de récupérer un évènement click pour chacune des 100 picturebox. Je ne sais pas comment faire. Il n'y a pas beaucoup de documentation sur le sujet, pour ne pas dire inexistant

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 154
    Par défaut
    Tu crées une procédure qui la même signature que l'évènement Click c.a.d :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub PictureBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
     
        End Sub
    Dans ta boucle de création de PictureBox tu abonnes le contrôle à l'évènement via HadHandler et tu places le N° dans le Tag (ça peut toujours servir)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Addhandler Me.maPicture(compte).Click, AddressOf PictureBox_Click
    Me.maPicture(compte).Tag=compte
    Dans ta procédure PictureBox_Click tu peux récuperer le PictureBox qui a levé l'evenement via l'objet sender en le castant en PictureBox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Private Sub PictureBox_Click_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim PicBox As PictureBox=DirectCast(sender,PictureBox)
     
        End Sub
    Il existe 3 méthode de Cast dont une qui ne léve pas d'Exception en cas d'erreur (TryCast). Tu peux aller voir ici pour plus détail :
    http://msdn2.microsoft.com/fr-fr/lib...6x(VS.80).aspx

    Normalement ton Cast ne lévera jamais d'erreur puisque tu n'abonnes que des PictureBox mais bon, c'est bon à savoir.

    Si tu veux connaître l'index tu peux le récuperer dans le Tag du PictureBox casté.

    Dans l'absolu, avec cette methode tu n'as même plus besoin d'avoir un tableau pour conserver une ref vers tes PictureBox. Ton Dim maPicture(100) As PictureBox
    tu peux le shooter et mettre ça dans ta boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim PicBox as new PictureBox
                    '  positionnement de chaque  picturebox
                    PicBox .Location = New System.Drawing.Point((largeur * large) + 400, (largeur * haute))
     [.../...]
                    ' Ajout du picturebox a la form
                    Me.Controls.Add(PicBox)
    C'est ta forms qui te servira de tableau en qq sorte.
    Ensuite tu as peut être une bonne raison d'avoir un tableau...
    Tu ne serais pas un ancien dev VB6 par hasard...
    Et oui c'est fini la proprieté Index dans les contrôles en .Net

    @+

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    Je vais tester ca bientôt...

    je suis un occasionnel de vb, la derniere fois c'était du VB4

  4. #4
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Citation Envoyé par yfleury Voir le message
    Je vais tester ca bientôt...

    je suis un occasionnel de vb, la derniere fois c'était du VB4
    J'ai deja crée un jeu avec 256 picturebox (une sorte de démineur) et puis j'ai utilisé à peu pres la meme méthode que décrite précédemment. Donc ca marchera sans problèmes majeurs
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    Bon, j'ai remodeler mon code pour ne plus avoir d'index. Pour être à la page...

    L'affichage des 100 picturebox se passe bien.

    Avec l'évènement click, je n'arrive pas à modifier l'une des picturebox (ni l'une , ni l'autre) comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub maPicture_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Dim maPicture As PictureBox = DirectCast(sender, PictureBox)
            compteur = compteur + 1
            Me.Label1.Text = compteur
            Me.maPicture.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
            Me.maPicture.Refresh()
     
        End Sub
    J'ai placer un compteur dans l'évènement click et il s'incrémente bien a chaque fois que je clique sur n'importe laquelle des picturebox

    ma nouvelle question est de savoir: comment retourner une image contenue dans un picturebox sur qui on vient de cliquer.

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    Eureka!

    j'ai trouver mon erreur, voici le code corriger
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub maPicture_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Dim maPic As PictureBox = DirectCast(sender, PictureBox)
            compteur = compteur + 1
            Me.Label1.Text = compteur
            maPic.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
            maPic.Refresh()
     
        End Sub
    je mettais le "me." devant maPic et j'obtenais une erreur...

    Ca fonctionne a merveille. mon Problème est résolu.

    Il ne me reste plus qu'a m'attaquer au drag and drop

  7. #7
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Deux choses supplémentaires pour toi :
    Pour l'incrémentation des compteurs utilise : cpt += 1
    Pour les conversions, utilise Ctype au lieu de DirectCast.
    Pas la peine de mettre de "me" dans ton cas.

    Correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub maPicture_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Dim maPic As PictureBox = Ctype(sender, PictureBox)
            compteur += 1
            Label1.Text = compteur
            maPic.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
            maPic.Refresh()
        End Sub
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    Merci pour l'info

    J'ai un autre problème.
    lors de la création des 100 picturebox, je profite de l'occasion pour ajouter une image dans chacun d'eux. Et ca fonctionne bien.

    mais je ne sais pas comment réaffecter d'autres image après coup.
    Dois-je supprimer les 100 picturebox et les recréer? si oui, comment les supprimer?

    ou comment changer d'image pour chacune des picturebox?

  9. #9
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Citation Envoyé par yfleury Voir le message
    Merci pour l'info

    J'ai un autre problème.
    lors de la création des 100 picturebox, je profite de l'occasion pour ajouter une image dans chacun d'eux. Et ca fonctionne bien.

    mais je ne sais pas comment réaffecter d'autres image après coup.
    Dois-je supprimer les 100 picturebox et les recréer? si oui, comment les supprimer?

    ou comment changer d'image pour chacune des picturebox?
    Non pour changer l'image, tu récupère ta picturebox dans l'evenement click par exemple et puis tu lui affecte une autre image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim maPic As PictureBox = Ctype(sender, PictureBox)
    maPic.Image = ...
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    Citation Envoyé par Aspic Voir le message
    Non pour changer l'image, tu récupère ta picturebox dans l'evenement click par exemple et puis tu lui affecte une autre image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim maPic As PictureBox = Ctype(sender, PictureBox)
    maPic.Image = ...
    oui ca je saurais faire. Mais c'est que je dois changer le 100 picturebox d'un coup. Avec ces 100 picturebox, je fais un puzzle, le client dois pouvoir changer d'image et donc rafraichir les 100 picturebox avec les morceaux de la nouvelle image

  11. #11
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 193
    Par défaut
    lu en diagonale donc je sais pas si c'est résolu ou si y a encore des problèmes
    pour un puzzle moi je ferais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private _morceaux as system.collections.generic.dictionnary(of integer, picturebox)
     
    for i = 0 to 99 :
    dim p as new picturebox
    placement_coordonnées
    p.image = morceau_d_image
    me.controls.add(p)
    _morceaux.add(i,p)

    et ensuite s'il veut changer de puzzle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i = 0 to 99
    replacement_coordonnées
    _morceaux(i).image = morceau_d_image


    ensuite pour ce qui est du drag and drop, il faut de l'evenementiel donc au moment de la création dans la boucle vous rajoutez
    addhandler p.evenement, addressof sub_qui_gere_cet_evenement

    dans sub_qui_gere_cet_evenement vous aurez obligatoirement l'objet pictureox qui a déclenché l'évènement donc vous pouvez faire un traitement dessus
    vous aurez aussi x et y de la souris
    il y a uns fonction sur la feuille qui permet de connaitre l'objet au premier plan pour une coordonnée, ou sinon vous parcourez votre collection à la recherche d'un picturebox dont les coordonnées conviennent
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    sperot51
    Avec ton code, j'obtenais une erreur que j'ai corriger comme ceci...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    'le code de sperot51
    private _morceaux as system.collections.generic.dictionnary(of integer, picturebox)
     
    'corriger comme ceci
    dim _morceau as new Dictionary(Of Integer, PictureBox)

    Tout mes problèmes sont donc résoluts. Voici donc, le code fonctionnement correctement pour créer 100 picturebox et récupérer l'évenement click pour chacun d'eux, ainsi que le moyen de changer l'image de chacun des picturebox.

    -----------------------------
    Dans la class de la Form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        Dim maPicture As PictureBox 
        Dim adresseImage As String = "C:\Users\Public\Pictures\Sample Pictures\Desert Landscape.jpg"
        Dim compteur As Integer = 0
     
    	'variable pour un controle direct de chacunes des picturebox 
        Public _morceaux As New Dictionary(Of Integer, PictureBox)
    La sub pour créer les 100 picturebox
    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
     
       Private Sub InitializePictureBox(ByVal largeur As Integer)
            Dim compte As Integer = 0
            Dim rotation, differencex, differencey, largeur1, hauteur1, diviseur As Integer
            Dim lalargeur, lahauteur As Integer
            Dim ImageCarrerOriginal As Image
     
    	'récupère une image pour la séparer en 100 morceaux
            ImageCarrerOriginal = Image.FromFile(adresseImage)
     
    	'mettre ici le code pour connaitre les dimensions de l'image
     
           	'boucle pour déposer les picturebox sur la form 
    	For large As Integer = 1 To 10
                For haute As Integer = 1 To 10
     
    		'compteur de picturebox
    		compte += 1
     
    		'Nouvelle PictureBox
                    maPicture = New PictureBox
     
                    ' Positionne la picturebox et fixe la dimension.
                    Me.maPicture.Location = New System.Drawing.Point((largeur * large) + 325, (largeur * haute))
                    Me.maPicture.Size = New System.Drawing.Size(largeur, largeur)
                    Me.maPicture.TabStop = False
     
    		'Création d'un évènement click pour cette picturebox
                    AddHandler Me.maPicture.Click, AddressOf maPicture_Click
     
                    ' Fixe le mode d'affichage.
                    Me.maPicture.SizeMode = PictureBoxSizeMode.Zoom
                    Me.maPicture.BorderStyle = BorderStyle.None
     
    		'ajoute un morceau de l'image originale a ce picturebox 
                    Me.maPicture.Image = ImagePart(ImageCarrerOriginal, (diviseur * large) - diviseur, (diviseur * haute) - diviseur, diviseur, diviseur)
     
    		'tourne l'image, c'est un puzzle après tout
    		Randomize()
                    rotation = CInt(Int((3 * Rnd()) + 1))
                    Me.maPicture.Image.RotateFlip(rotation)
     
                    ' Ajoute la picturebox à la form
                    Me.Controls.Add(Me.maPicture)
     
    		'Ici on associe la picturebox à un index dans la vaviable _morceaux
                    _morceaux.Add(compte, Me.maPicture)
     
                Next
            Next
        End Sub
    Pour récuppérer l'évènement click de l'une des picturebox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Private Sub maPicture_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    	'Récupération de la picturebox qui a été cliqué
            Dim maPic As PictureBox = CType(sender, PictureBox)
     
    	'applique les modification que l'on désir sur la picturebox
            maPic.Image.RotateFlip(RotateFlipType.Rotate90FlipNone)
            maPic.Refresh()
     
        End Sub
    Et finalement pour modifier l'une des picturebox sans avoir déclanché un évènement, on appel la picturebox directement comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            'compte = un integer de 1 à 100, vous pouvez modifier la picturebox désirée        
    	Me._morceaux(compte).Image = une_autre_image
    Un Merci Spécial pour l'aide obtenu à:
    MaelstroeM, Aspic et sperot51

    NB: mon code est brut et je dois le retravailler pour être plus efficace. Cependant, tout ce code permet de faire ce que je veux.
    A savoir:
    1 Créer 100 picturebox directement dans le code
    2 Récupérer l'évènement click pour chacun d'eux
    3 Modifier chacune des picturebox directement comme une picturebox généré par l'éditeur vb 2005 express

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    Une dernière information...

    Avec cette méthode, j'ai pu réaliser un puzzle de 400 morceaux sans difficulté.

    Encore merci a tous.

  14. #14
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 193
    Par défaut
    et as tu des problèmes de performances ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    A priori, non. Je charge l'image une seule fois dans une variable et ca roulle bien en mode debug (debug est plus lent) sur un ordinateur bas de gamme.

    pour le puzzle a 400 morceaux, ca prend environ 1 à 2 secondes pour que ca soit visible.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Evenement Click sur Datagrid
    Par Joad dans le forum ASP.NET
    Réponses: 2
    Dernier message: 30/05/2005, 13h37
  2. [vb.net] retourner une valeur dans l'evenement click
    Par graphicsxp dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/05/2005, 13h06
  3. [VBA] Evenement Click Cellule
    Par kribot dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/01/2005, 09h47
  4. besoin d aide evenement click droit
    Par yuvino dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/12/2004, 10h32
  5. [C#] Evenement click dans un Panel
    Par keyser-soze dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/05/2004, 22h21

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