Cambiare cursore in aree di una PictureBox

domenica 14 ottobre 2007 - 18.08

id86 Profilo | Newbie

Ciao a tutti!
Ho due domande (basta che rispondiate a una per risolvermi ogni problema!)

1) Ho una grande PictureBox e voglio che il cursore, su taluni punti della stessa, divenga di tipo Hand. C'è un modo efficiente per farlo? A me era venuto in mente di usare l'evento MouseMove ma la vedo impraticabile dato che questi punti dovrebbero essere un centinaio.

2) Ho una PictureBox piccola e una PictureBox grande, una sopra l'altra. Vorrei che all'inizio la PictureBox piccola non si veda, ma si veda solo quella grande. Vorrei che andando col mouse sull'area in cui c'è la PictureBox piccola il cursore divenga di tipo Hand. Se poi l'utente preme lì sopra, la PictureBox piccola deve apparire sopra quella grande.

Avete idee?

Xnetus Profilo | Junior Member

>1) Ho una grande PictureBox e voglio che il cursore, su taluni
>punti della stessa, divenga di tipo Hand. C'è un modo efficiente
>per farlo? A me era venuto in mente di usare l'evento MouseMove
>ma la vedo impraticabile dato che questi punti dovrebbero essere
>un centinaio.

Devi inserire:
PictureBox1.Cursor = Cursors.Hand

http://blogs.dotnethell.it/Xnetus/

id86 Profilo | Newbie

ma così il cursore Hand si manifesterebbe su tutta l'area della picturebox. io ho specificato che la voglio solo su porzioni di essa!

aiedail92 Profilo | Expert

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:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

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:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5