Bonjour,
Si ça peut t'aider, j'ai pondu ça rapidement.
Il s'agit d'un composant pompeusement nommé ImageView chargé d'afficher des vignettes. Le composant gère automatiquement les scrollbars si les vignettes ne peuvent être toutes affichées. Don y'a pu rien à faire.
Je l'ai accompagné d'une fenêtre de démonstration.
Pour tester, il te suffit de créer une nouvelle fenêtre et de coller tout le code figurant ci-dessous en lieu et place de celui généré par défaut par VB.
Deux boutons te permettront d'ajouter ou de supprimer des images. En cliquant une des images, la sélection s'affiche en plus grand dans un picturebox de contrôle.
Bon c'est pas vraiment fini et c'est naturellement perfectible mais ça marche plutôt bien d'après les quelques tests que j'ai faits.
Voilà,
Bonne utilisation
MD
''' <summary>
''' La fenêtre d'exécution
''' </summary>
''' <remarks></remarks>
Public Class Form1
Private WithEvents ctrImgView As ImageView
Private WithEvents btnAjouter As Button
Private WithEvents btnSupprimer As Button
Private pImageBox As PictureBox
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Size = New Size(600, 480)
'Création des contrôles 2 boutons qui serviront à manipuler le composant, et de la picturebox qui affichera l'image sélectionnée
btnAjouter New Button With {.Text "Ajouter", .Location = New Point(350, 350)}
btnSupprimer New Button With {.Text "Supprimer", .Location = New Point(350, 400)}
pImageBox New PictureBox With {.Size New Size(200, 200), .Location = New Point(350, 20), .SizeMode = PictureBoxSizeMode.StretchImage}
'Création du composant ImageView
ctrImgView New ImageView With {.Size New Size(300, 400), .Location = New Point(20, 20)}
'On peut changer certaines propriétés
ctrImgView.NbreImagesParLigne = 3
'Ajout des contrôles à la fenêtre d'exécution
Me.Controls.Add(ctrImgView)
Me.Controls.Add(btnAjouter)
Me.Controls.Add(btnSupprimer)
Me.Controls.Add(pImageBox)
End Sub
Private Sub btnAjouter_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAjouter.Click
'Le bouton Ajouter permet d'ajouter des images au composant ImageView
Dim ouvrir As New OpenFileDialog
ouvrir.Filter = "Fichiers jpg|*.jpg|Fichiers bmp|*.bmp|Fichiers gif|*.gif|Tous les fichiers jpg|*.*"
ouvrir.ShowDialog()
If ouvrir.FileName <> "" Then
'Ajout de l'image
ctrImgView.AjouterImage(New Bitmap(ouvrir.FileName))
End If
End Sub
Private Sub btnSupprimer_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSupprimer.Click
'Ici on supprime l'image sélectionnée
If ctrImgView.IdImageSelectionnee > -1 Then
'Suppression de l'image
ctrImgView.SupprimerImage(ctrImgView.IdImageSelectionnee)
'Le picturebox de la fenêtre d'exécution est vide
pImageBox.Image = Nothing
End If
End Sub
Private Sub ctrImgView_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctrImgView.SelectionChanged
'Gestion de l'évènement SelectionChanged renvoyé par le composant ImageView
Dim pbox As PictureBox = DirectCast(sender, PictureBox)
'On affiche l'image sélectionnée dans le picturebox de contrôle
pImageBox.Image = pbox.Image
End Sub
End Class
''' <summary>
''' Le composant ImageView
''' </summary>
''' <remarks></remarks>
Public Class ImageView
Inherits Panel
Private pPictureBoxes As New List(Of PictureBox)
Private pSize As New Size(100, 100)
Private pEcart As Integer = 5
Private pNbreImagesParLigne As Integer = 3
Private pSelection As Integer = -1
'Création de l'évènement SelectionChanged
Public Event SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs)
Public Sub New()
Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle
Me.Size = New Size(400, 200)
Me.AutoScroll = True
End Sub
Private Sub Reorganiser()
'Réorganise les images dans le composant
Dim HScrollValue As Integer = Me.HorizontalScroll.Value
Dim VScrollValue As Integer = Me.VerticalScroll.Value
Me.VerticalScroll.Value = 0
Me.HorizontalScroll.Value = 0
Dim position As New Point(pEcart, pEcart)
Dim cmpt As Integer = 0
For Each pbox As PictureBox In pPictureBoxes
pbox.Location = position
cmpt += 1
If cmpt = pNbreImagesParLigne Then
cmpt = 0
position.Offset(pEcart - position.X, pSize.Height + pEcart)
Else
position.Offset(pSize.Width + pEcart, 0)
End If
Next
End Sub
Public Sub AjouterImage(ByVal bmp As Bitmap)
'Ajout d'une image
Dim pbox As New PictureBox
pbox.Size = pSize
pbox.SizeMode = PictureBoxSizeMode.StretchImage
pbox.Image = bmp
AddHandler pbox.Click, New eventhandler(AddressOf Image_Click)
pPictureBoxes.Add(pbox)
Me.Controls.Add(pbox)
'Réorganiser les images
Reorganiser()
End Sub
Public Sub SupprimerImage(ByVal index As Integer)
'Suppression d'une image par son index
If index < 0 Or index > pPictureBoxes.Count - 1 Then
Return
End If
If index = pSelection Then
pSelection = -1
End If
Dim pbox = pPictureBoxes(index)
Me.Controls.Remove(pbox)
pPictureBoxes.Remove(pbox)
'Réorganiser les images
Reorganiser()
End Sub
Public Property NbreImagesParLigne() As Integer
'Propriété définissant le nombre d'images par ligne
Get
Return pNbreImagesParLigne
End Get
Set(ByVal value As Integer)
pNbreImagesParLigne = value
Reorganiser()
End Set
End Property
Public Property TailleDesImages() As Size
Get
Return pSize
End Get
Set(ByVal value As Size)
pSize = value
Reorganiser()
End Set
End Property
Public Property IdImageSelectionnee() As Integer
'Obtient ou définit l'index de l'image sélectionnée
Get
Return pSelection
End Get
Set(ByVal value As Integer)
ChangerSelection(value)
End Set
End Property
Public ReadOnly Property Image(ByVal index As Integer) As Bitmap
'Renvoie le bitmap d'une image appelée par son index
Get
If index < 0 Or index > pPictureBoxes.Count - 1 Then
Return Nothing
Else
Return pPictureBoxes(index).Image
End If
End Get
End Property
Private Sub ChangerSelection(ByVal nouvelleSelection As Integer)
If pSelection > -1 Then
pPictureBoxes(pSelection).BorderStyle = Windows.Forms.BorderStyle.None
End If
pSelection = nouvelleSelection
pPictureBoxes(pSelection).BorderStyle = Windows.Forms.BorderStyle.FixedSingle
End Sub
Private Sub Image_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim pbox As PictureBox = DirectCast(sender, PictureBox)
ChangerSelection(pPictureBoxes.IndexOf(pbox))
RaiseEvent SelectionChanged(sender, e)
End Sub
Private Sub ImageView_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
Reorganiser()
End Sub
End Class