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ébutant] Alterner deux images dans une pictureBox.


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 41
    Points : 21
    Points
    21
    Par défaut [Débutant] Alterner deux images dans une pictureBox.
    Bonjour à tous.

    Dans le cadre d'un projet pour mes cours, je dois créer une sorte de simulation de trains sous visual basic. Ça ne se passait pas trop mal jusqu'à ce que je tombe sur un problème franchement coriace.

    Je dois concevoir un système qui me permet de changer le sens de mes aiguillages, illustrés par une picturebox. Ce que je veux faire par conséquent, c'est changer l'image de ma picturebox lorsque je double-clique dessus. Ainsi, si l'image1 est affichée, on passera à l'image2, et inversement. J'ai donc eu l'idée de ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub alternerAiguillageN(sender As Object, e As EventArgs)
            If enFonction = False Then  ' Ici ne tenez pas compte du contrôle, c'est pour autre chose.
                If sender.Image Is My.Resources.AiguillageNE Then
                    sender.Image = My.Resources.AiguillageNO
                    lblInfo.Text = "Sens d'aiguillage changé NO"
                    ' Donc si Image1, Alors Image2
                Else : sender.image = My.Resources.AiguillageNE
                    lblInfo.Text = "Sens d'aiguillage changé NE"
                    ' Sinon, image1
                End If
            End If
        End Sub
    L'ennui, c'est que ça ne marche que d'un seul sens. Je peux passer de l'image 2 à l'image 1 très exactement, mais pas l'inverse. J'ai essayé en changeant mon Else en ElseIf, mais c'est encore pire car on dirait que je n'arrive même pas à entrer dans la conditionnelle de cette manière. Je ne sais vraiment plus quoi faire du coup. Pensez vous pouvoir m'aider ?

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    Il faut aller dans une petite gare ...ou un vieux manoeuvrier gere le passage des locomotives avec un panneau metallique drapeau (flag) à 2 faces(rouge et vert):

    Rouge train A passe et je retourne mon panneau drapeau...(aie aie mon poignet)
    Vert train B passe et je retourne mon panneau drapeau.....(aie aie mon poignet)

    Pour l'informaticien le drapeau est un flag boolean (rouge = true,blue = false)...et le bras est une machine ...ouf


    code vb...
    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
     
     
    Private flag As Boolean
        Private Sub alternerAiguillageN(ByVal sender As Object, ByVal e As EventArgs)
            ' Ne tenez pas compte du contrôle ci-dessus, c'est pour autre chose.
     
            If Not flag Then
                sender.Image = My.Resources.AiguillageNO
                LblInfo.Text = "Sens d'aiguillage changé NO"
                ' Donc si Image1, Alors Image2
     
            Else
                sender.image = My.Resources.AiguillageNE
                LblInfo.Text = "Sens d'aiguillage changé NE"
                ' Sinon, image1
            End If
            flag = Not flag
        End Sub
    bon code...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 41
    Points : 21
    Points
    21
    Par défaut
    Bonjour MABROUKI.

    Le problème est que ma pictureBox est générée par un tableau de picturebox de x*y cases. Par conséquent, si j'utilise un drapeau, il faut que je fasse un tableau de booléen de x*y cases derrière (je suppose), ce dont j'aimerais éviter car pas toutes les cases de mon tableau sont des aiguillages. Y a-t-il un autre moyen pour déclarer mes booléens efficacement ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Technicien bio médical
    Inscrit en
    Décembre 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien bio médical
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 328
    Points : 768
    Points
    768
    Par défaut
    Bonjour,

    En essayant de coder quelque chose pour vous aider, ma première idée était d'écrire comme vous une procédure qui changerait l'image. Je me suis dit, "Tiens je vais y planter une ImageList, jouer avec l'index pour renvoyer l'image".
    Au bout de 10 minutes, ça m'a gonflé.
    Alors comme j'aime pas abandonner, je me suis dit, pourquoi ne pas créer un contrôle qui hérite de PictureBox et auquel on rajoute une propriété ImageList et en surchargeant OnDoubleClick changer l'image affichée.

    Ca donne :
    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
     
    Public Class MyPictureBox
        Inherits PictureBox
     
        <Category("Data")>
        Public Overridable Property ImageList As ImageList
     
        Public Overridable Property SelectedImageIndex As Integer = 0
     
        Protected Overrides Sub OnDoubleClick(e As EventArgs)
            MyBase.OnDoubleClick(e)
            If Not IsNothing(Me.ImageList) Then
                If Me.SelectedImageIndex < Me.ImageList.Images.Count - 1 Then
                    Me.SelectedImageIndex += 1
                    Me.Image = Me.ImageList.Images(Me.SelectedImageIndex)
                ElseIf Me.SelectedImageIndex = Me.ImageList.Images.Count - 1 Then
                    Me.SelectedImageIndex = 0
                    Me.Image = Me.ImageList.Images(Me.SelectedImageIndex)
                End If
            Else
                Throw New IndexOutOfRangeException
            End If
        End Sub
    End Class
    Ca fonctionne bien, mais il reste à gérer le texte à afficher.

    EDIT: Vous avez posté pendant que j'écrivais le miens Vous pouvez en dire plus sur :
    ma pictureBox est générée par un tableau de picturebox de x*y cases.
    ?
    est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 41
    Points : 21
    Points
    21
    Par défaut
    J'ai simplement déclaré un tableau tableauDeJeu qui est un tableau 2D de picturebox.

    Voici mon code. A mon avis ce sera plus simple qu'un explication textuelle.

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    Public Class Form1
     
        Dim m_MouseIsDown As Boolean
        Dim tableauDeJeu(10, 10) As PictureBox
        Dim p As Point
        Dim save As PictureBox
        Dim enFonction As Boolean 'Sert pour le placement des rails. Si "true", alors nous sommes en mode de placement de rails.
     
     
        Private Sub BtnSupprTrains_Click(sender As Object, e As EventArgs) Handles BtnSupprTrains.Click
     
        End Sub
     
        Private Sub btnQuitter_Click(sender As Object, e As EventArgs) Handles btnQuitter.Click
            Me.Dispose()
        End Sub
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     
     
            enFonction = False
            p = New Point(pnlJeu.Width, pnlJeu.Height)
            Dim i As Integer
            Dim j As Integer
            For i = 0 To 9
                For j = 0 To 9
                    tableauDeJeu(i, j) = New PictureBox
                    tableauDeJeu(i, j).BorderStyle = BorderStyle.FixedSingle
                    tableauDeJeu(i, j).Width = 40
                    tableauDeJeu(i, j).Height = 40
                    tableauDeJeu(i, j).Location = New Point(p.Y / 2 + (tableauDeJeu(i, j).Width * (i + 1)), p.X - (tableauDeJeu(i, j).Height * (j + 1)))
                    pnlJeu.Controls.Add(tableauDeJeu(i, j))
                    AddHandler tableauDeJeu(i, j).Click, AddressOf AjouterImage
                    AddHandler tableauDeJeu(i, j).Click, AddressOf placerTrain
                Next
            Next
     
     
        End Sub
     
        Private Sub picturebox_click(sender As Object, e As EventArgs) Handles pbAiguillageE.Click, pbAiguillageS.Click, pbAiguillageO.Click, pbAiguillageN.Click, pbRailV.Click, pbRailH.Click, pbRailNE.Click, pbRailNO.Click, pbRailSE.Click, pbRailSO.Click, pbCarrefour.Click, pbStation.Click, pbTerminus.Click
            If enFonction = False Then
                lblInfo.Text = "Cliquez sur une case de la grille placer votre élément."
                save = sender
                enFonction = True
            End If
     
        End Sub
     
        Private Sub AjouterImage(sender As PictureBox, e As EventArgs)
            If enFonction = True Then
                sender.Image = save.Image
                enFonction = False
     
                If sender.Image Is pbAiguillageE.Image Then
                    sender.Image = My.Resources.AiguillageES
                    AddHandler sender.DoubleClick, AddressOf alternerAiguillageE
     
     
                ElseIf sender.Image Is pbAiguillageO.Image Then
                    sender.Image = My.Resources.AiguillageON
                    AddHandler sender.DoubleClick, AddressOf alternerAiguillageO
     
     
                ElseIf sender.Image Is pbAiguillageN.Image Then
                    sender.Image = My.Resources.AiguillageNE
                    AddHandler sender.DoubleClick, AddressOf alternerAiguillageN
     
     
                ElseIf sender.Image Is pbAiguillageS.Image Then
                    sender.Image = My.Resources.AiguillageSE
                    AddHandler sender.DoubleClick, AddressOf alternerAiguillageS
     
     
                End If
            End If
        End Sub
     
        Private Sub btnPlay_Click(sender As Object, e As EventArgs) Handles btnPlay.Click
     
        End Sub
     
        Private Sub alternerAiguillageE(sender As PictureBox, e As EventArgs)
            If enFonction = False Then
                If sender.Image Is My.Resources.AiguillageES Then
                    sender.Image = My.Resources.AiguillageEN
                Else : sender.Image = My.Resources.AiguillageES
                End If
            End If
            lblInfo.Text = "Sens d'aiguillage changé"
        End Sub
     
        Private Sub alternerAiguillageO(sender As PictureBox, e As EventArgs)
            If enFonction = False Then
                If sender.Image Is My.Resources.AiguillageOS Then
                    sender.Image = My.Resources.AiguillageON
                Else : sender.Image = My.Resources.AiguillageOS
                End If
            End If
            lblInfo.Text = "Sens d'aiguillage changé"
        End Sub
     
        Private Sub alternerAiguillageN(sender As Object, e As EventArgs)
            If enFonction = False Then
                If sender.Image Is My.Resources.AiguillageNE Then
                    sender.Image = My.Resources.AiguillageNO
                    lblInfo.Text = "Sens d'aiguillage changé NO"
                Else : sender.image = My.Resources.AiguillageNE
                    lblInfo.Text = "Sens d'aiguillage changé NE"
                End If
            End If
        End Sub
     
        Private Sub alternerAiguillageS(sender As PictureBox, e As EventArgs)
            If enFonction = False Then
                If sender.Image Is My.Resources.AiguillageSE Then
                    sender.Image = My.Resources.AiguillageSO
                Else : sender.Image = My.Resources.AiguillageSE
                End If
            End If
            lblInfo.Text = "Sens d'aiguillage changé"
        End Sub
    End Class
    J'espère qu'il ne sera pas trop dur à comprendre, je ne l'ai pas beaucoup commenté.

  6. #6
    Membre éclairé
    Homme Profil pro
    Technicien bio médical
    Inscrit en
    Décembre 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien bio médical
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 328
    Points : 768
    Points
    768
    Par défaut
    J'ai un peu de mal avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AddHandler tableauDeJeu(i, j).Click, AddressOf AjouterImage
    AddHandler tableauDeJeu(i, j).Click, AddressOf placerTrain
    n'y aurait il pas une erreur?
    Ça commence à faire beaucoup d'évènements Click

    Combien d'images différentes d'aiguillage avez vous ? (j'en ai déduit qu'il y en avait 4)
    Si c'est le cas, ma solution peut vous servir, vous placez les 4 images dans l'ImageList et vous renseignez la propriété ImageList du contrôle MyPictureBox.
    est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    re
    Voici le genre de post que j'appelle un serpent de mer ou l'on decouvre la foret cache par l'arbre ...
    J'ai oublie de dire que le vieux manoeuvrier a plus d'un tour dans son sac ...
    Le code donne fonctionne toujours mais cette fois chaque quidam picturebox est charge de gerer lui-meme son propre etat anterieur dans le fameux champ tag...qui peut servir à stocker toute sorte d'objet(boolean,couleur visibilite etc...) sacrebleu !!!
    code .vb
    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
     
     Private Sub alternerAiguillageN(ByVal sender As Object, ByVal e As EventArgs)
            ' Ne tenez pas compte du contrôle ci-dessus, c'est pour autre chose.
            Dim pic As PictureBox = CType(sender, PictureBox)
            If CType(pic.Tag, Boolean) Then
                sender.Image = My.Resources.AiguillageNO
                LblInfo.Text = "Sens d'aiguillage changé NO"
                ' Donc si Image1, Alors Image2
     
            Else
                sender.image = My.Resources.AiguillageNE
                LblInfo.Text = "Sens d'aiguillage changé NE"
                ' Sinon, image1
            End If
            pic.Tag = Not pic.Tag
        End Sub
    bon code...

  8. #8
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Bonjour

    au lieu de Dim tableauDeJeu(10, 10) As PictureBox
    utilise plutot les listes génériques
    en gros

    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
    private mesaiguillages as new list( of picturebox) 
        private im1 ,im2 as bitmap 'les bitmap pour les deux aiguillages 
        Une sub pour créer ta liste d'aiguillage 
          Private Sub Init()
             dim leftpic, toppic as integer 
             'position du premier aiguillage 
             leftpic = 0
             toppic = 0
             For iter As Integer = 0 To 49  '50 aiguillages
                Dim monaguillage  As New PictureBox
                With monaguillage
                    .BorderStyle = BorderStyle.Fixed3D
                    .Location = New Point(leftpic, toppic)
                     ' le tag te sert pour indiquer l'image de l'aiguillage 
                    .Tag = "Im1"
                    .image = im1
                    .size = im1.size
                    listpics.Add(monaguillage)
                    AddHandler monaguillage.Mouseclick, AddressOf monaguillageMouseclick
                End With
                toppic =  ?
                leftpic  =  ?
                Me.Controls.Add(monaguillage)
                monaguillage.BringToFront()
            Next
      End Sub
     
        Private Sub monaguillageMouseclick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        'à chaque click on alterne l'image 
         If DirectCast(sender, PictureBox).Tag.ToString = "im1" Then
             DirectCast(sender, PictureBox).image = im2
             DirectCast(sender, PictureBox).Tag.ToString = "im2"
          else
              DirectCast(sender, PictureBox).image = im1
             DirectCast(sender, PictureBox).Tag.ToString = "im1"
         End If
        End Sub
     
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
           Init()
     
        End Sub
     
     
        Public Sub New()
     
            ' This call is required by the designer.
            InitializeComponent()
            'disons dans ta resource tu as deux images nommés aiguillage1 et "aiguillage2 
            im1 = CType(My.Resources.ResourceManager.GetObject("aiguillage1"), Bitmap)
            im2 = CType(My.Resources.ResourceManager.GetObject("aiguillage2"), Bitmap)
            ' Add any initialization after the InitializeComponent() call.
     
        End Sub
    End Class
    Au fait c'est pour la ligne Paris Pekin avec 100000 aiguillages ?

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 41
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par MABROUKI Voir le message
    re
    Voici le genre de post que j'appelle un serpent de mer ou l'on decouvre la foret cache par l'arbre ...
    J'ai oublie de dire que le vieux manoeuvrier a plus d'un tour dans son sac ...
    Le code donne fonctionne toujours mais cette fois chaque quidam picturebox est charge de gerer lui-meme son propre etat anterieur dans le fameux champ tag...qui peut servir à stocker toute sorte d'objet(boolean,couleur visibilite etc...) sacrebleu !!!
    code .vb
    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
     
     Private Sub alternerAiguillageN(ByVal sender As Object, ByVal e As EventArgs)
            ' Ne tenez pas compte du contrôle ci-dessus, c'est pour autre chose.
            Dim pic As PictureBox = CType(sender, PictureBox)
            If CType(pic.Tag, Boolean) Then
                sender.Image = My.Resources.AiguillageNO
                LblInfo.Text = "Sens d'aiguillage changé NO"
                ' Donc si Image1, Alors Image2
     
            Else
                sender.image = My.Resources.AiguillageNE
                LblInfo.Text = "Sens d'aiguillage changé NE"
                ' Sinon, image1
            End If
            pic.Tag = Not pic.Tag
        End Sub
    bon code...

    Je viens d'essayer, ça m'a beaucoup débloqué. Merci beaucoup.

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

Discussions similaires

  1. Probléme d'image dans une picturebox
    Par Arsou dans le forum Windows Forms
    Réponses: 2
    Dernier message: 30/09/2009, 14h31
  2. Plusieurs images dans une PictureBox
    Par adien.fanget dans le forum Windows Forms
    Réponses: 8
    Dernier message: 13/02/2009, 16h42
  3. Deux images dans une même fenêtre
    Par ambessa dans le forum OpenCV
    Réponses: 3
    Dernier message: 23/06/2008, 17h54
  4. [C#]Modifier l'image dans une PictureBox depuis un flux http
    Par f.colo dans le forum Windows Forms
    Réponses: 1
    Dernier message: 14/02/2006, 09h18

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