Ciao
Mi rendo conto che il thread sia un po' vecchiotto, ma forse il problema persiste ancora...
Questa è la soluzione che ho trovato per il primo punto (supponendo che i punti nei quali il cursore deve diventare Hand siano i rettangoli delle PictureBox):
Dichiari una variabile globale di tipo List(Of Rectangle) che vai a popolare prima che la Form venga caricata per la prima volta, in questo modo:
'Contiene tutti i rettangoli nei quali il cursore deve diventare Hand
Dim rectangles As List(Of Rectangle)
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
'Inizializzo rectangles supponendo di avere
'un centinaio di immagini (la lista si
'ridimensiona comunque automaticamente se necessario)
rectangles = New List(Of Rectangle)(100)
'Popolo rectangles coi rettangoli delle picturebox
For Each pictBox As PictureBox In Me.Controls
'non bisogna aggiungere la PictureBox grande
If Not pictBox Is Me.pictureBoxGrande Then
'Poichè la posizione è data rispetto al controllo padre...
Dim location As Point = pictBox.Location
'... Eseguo un offset per ottenerla rispetto alla PictureBox grande
location.Offset(-pictureBoxGrande.Location.X, -pictureBoxGrande.Location.Y)
'Infine aggiungo il rettangolo alla lista
rectangles.Add(New Rectangle(location, pictBox.Size))
End If
Next
End Sub
Questa list verrà utilizzata durante l'evento MouseMove della PictureBox grande per controllare se il mouse si trova o meno in uno dei rettangoli:
Simile soluzione ho trovato per il secondo punto: questa volta invece che utilizzare una List generica, sfruttiamo un Dictionary(Of PictureBox, Rectangle). In questo modo associamo ad ogni PictureBox del Dictionary il rettangolo della sua posizione relativa alla PictureBox grande (così da non doverla ricalcolare tutte le volte). Successivamente si procede nello stesso modo, facendo il controllo della posizione del mouse fra i valori del Dictionary:
Luca