Tu peux faire le test rapidement en changeant un peu le code ci-dessus en celui-là (bon ça met un peu plus de temps mais ca reste acceptable) :
Option Strict On
Public Class Form1
Dim rd As New Random
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Me.WindowState = FormWindowState.Maximized
'301 formes
For x = 0 To 300
'liste de points
Dim pts As New List(Of Point)
'ajout des points
pts.Add(New Point(rd.Next(300), rd.Next(300)))
pts.Add(New Point(rd.Next(300), rd.Next(300)))
pts.Add(New Point(rd.Next(300), rd.Next(300)))
pts.Add(New Point(rd.Next(300), rd.Next(300)))
pts.Add(New Point(rd.Next(300), rd.Next(300)))
pts.Add(New Point(rd.Next(300), rd.Next(300)))
pts.Add(New Point(rd.Next(300), rd.Next(300)))
pts.Add(New Point(rd.Next(300), rd.Next(300)))
pts.Add(New Point(rd.Next(300), rd.Next(300)))
'nouvelle instance de classe
Dim pct As New clsPiece(pts, x.ToString)
'paramètres
With pct
.BackColor = Color.FromArgb(rd.Next(255), rd.Next(255), rd.Next(255))
.Location = New Point(rd.Next(1000), rd.Next(1000))
.Size = New Size(300, 300)
End With
'événements
AddHandler pct.MouseEnter, AddressOf pct_MouseEnter
AddHandler pct.MouseLeave, AddressOf pct_MouseLeave
AddHandler pct.Click, AddressOf pct_Click
'ajout au formulaire
Me.Controls.Add(pct)
Next
End Sub
'événements picturebox
Private Sub pct_Click(sender As Object, e As EventArgs)
MessageBox.Show(DirectCast(sender, PictureBox).Name)
End Sub
Private Sub pct_MouseEnter(sender As Object, e As EventArgs)
Cursor = Cursors.Hand
End Sub
Private Sub pct_MouseLeave(sender As Object, e As EventArgs)
Cursor = Cursors.Default
End Sub
End Class
Public Class clsPiece
Inherits PictureBox
Sub New(points As List(Of Point), Nom As String)
Me.Name = Nom
Dim _region(points.Count - 1) As Byte
For x = 0 To points.Count - 1
_region(x) = CType(Drawing2D.PathPointType.Line, Byte)
Next
'déclaration du graphic path
Dim path As New Drawing2D.GraphicsPath(points.ToArray, _region)
'régionage du picturebox
Me.Region = New Region(path)
End Sub
End Class