Appunti di Programmazione

Creative Commons License

Scrolling an Image

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

Immagine applicazione finita 2

Download sorgente "ScrollImage.zip" ( 92KB )