Ho avuto la necessità di inserire un'immagine di grandi dimensioni in una PictureBox con misure contenute e attraverso l'uso delle scrollbar scorrere la foto in entrambe le direzioni per poterla visionare nella sua totalità.
Ho trovato due metodi.
1:-Si usa un Panel come contenitore di una PictureBox che a sua volta contiene l'immagine da visionare. Il vantaggio di questa soluzione è che fa esattamente quello che voglio senza dovere scrivere alcuna riga di codice; l'unica cosa da fare è impostare a True la proprietà Autoscroll del controllo, la quale comunica al compilatore che il Panel deve mostrare le barre di scorrimento se al suo interno viene collocato un controllo troppo grande per essere rappresentato interamente.
Questi due controlli espongono 4 importanti proprietà :
- Minimum: valore minimo dell'intervallo di scorrimento
- Maximum: valore massimo dell'intervallo di scorrimento
- SmallChange: incremento del valore se viene usata una delle due frecce del controllo
- LargeChange: incremento del valore se viene cliccato sulla barra di scorrimento.
La cosa inaspettata è che se scorrete con una scrollbar TUTTI i possibili valori selezionabili, essi non saranno quelli che sono impostati con Minimum e Maximum, bensi questi:
Il valore più basso corrisponde a Minimum
Il valore più alto = Maximum-LargeChange+1
Se mantenete i valori di default (Maximum=100; LargeChange=10) si ha:
Il valore più basso corrisponde a "0"
Il valore più alto = "100-10+1=91"
Il programma, semplicemente, associa alle scrollbar i valori che si ricavano valutando le dimensioni dell'immagine da visualizzare e quelle della PictureBox che la deve rappresentare, impostando i corretti valori di Minimum e Maximum.
Public Class Form1 'definizione dei controlli Dim panel1 As New Panel Dim pb1 As New PictureBox Private WithEvents pb2 As New PictureBox Private WithEvents vSB As New VScrollBar Private WithEvents hSB As New HScrollBar Dim lbl1 As New Label Dim lbl2 As New Label 'immagine che sarà inserita nella PictureBox2 Dim img As Bitmap 'coordinate del punto ALTO-SINISTRA della PictureBox pb2 Dim x As Integer = 0 Dim y As Integer = 0 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Me.Size = New Size(550, 350) Me.Text = "Scrolling an Image" 'caricamento dell'immagine img = My.Resources.Test With panel1 .Size = New Size(210, 210) .Location = New Point(43, 63) 'impostazione dell'AutoScroll per visualizzare le ScrollBars se l'immagine caricata è più grande del Panel .AutoScroll = True End With With pb1 .Location = New Point(0, 0) .SizeMode = PictureBoxSizeMode.AutoSize .Image = My.Resources.Test End With With pb2 .Size = New Size(193, 193) .Location = New Point(297, 63) 'impostazione delle dimensioni della PictureBox alle stesse dell'immagine caricata .SizeMode = PictureBoxSizeMode.Normal .Image = img End With With vSB .Size = New Size(17, 193) .Location = New Point(490, 63) 'impostazione dei valori minimo e massimo in cui deve operare la ScrollBar .Minimum = 0 .Maximum = img.Height - pb2.Height + vSB.LargeChange - 1 End With With hSB .Size = New Size(193, 17) .Location = New Point(297, 256) 'impostazione dei valori minimo e massimo in cui deve operare la ScrollBar .Minimum = 0 .Maximum = img.Width - pb2.Width + hSB.LargeChange - 1 End With With lbl1 .AutoSize = False .Location = New Point(43, 35) .Font = New System.Drawing.Font("Microsoft Sans Serif", 14.25!, System.Drawing.FontStyle.Regular) .Size = New Size(100, 24) .Text = "Panel" End With With lbl2 .AutoSize = False .Location = New Point(297, 35) .Font = New System.Drawing.Font("Microsoft Sans Serif", 14.25!, System.Drawing.FontStyle.Regular) .Size = New Size(120, 24) .Text = "PictureBox" End With 'Aggiunta dei controlli Me.Controls.Add(panel1) Me.panel1.Controls.Add(pb1) Me.Controls.Add(pb2) Me.Controls.Add(hSB) Me.Controls.Add(vSB) Me.Controls.Add(lbl1) Me.Controls.Add(lbl2) End Sub Private Sub vSB_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) _ Handles vSB.Scroll 'recupero della nuova ordinata dell'immagine y = -vSB.Value 'Invalidazione del controllo per poterne ridisegnare il contenuto Me.pb2.Invalidate() End Sub Private Sub hSB_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) _ Handles hSB.Scroll 'recupero della nuova ordinata dell'immagine x = -hSB.Value 'Invalidazione del controllo per poterne ridisegnare il contenuto Me.pb2.Invalidate() End Sub Private Sub pb2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) _ Handles pb2.Paint 'disegno dell'immmagine e.Graphics.DrawImage(img, x, y) End Sub End Class