+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 2 su 2

Scrolling an image

  1. #1
    L'avatar di Gandalfrank
    Gandalfrank non è in linea Scribacchino
    Vi è capitato di dovere visionare un'immagine piuttosto grande in una PictureBox di dimensioni contenute e di dover implementare la funzione dello scrolling con le barre di scorrimento ?

    Per risolvere questo problema ho trovato due soluzioni entrambe efficaci che ho riunito in un unico piccolo programma che allego di seguito.

    1. La prima soluzione adotta l'utilizzo di un Panel come contenitore della PictureBox che a sua volta ospiterà l'immagine da visionare. E' molto importante che la PictureBox abbia le dimensioni uguali a quella dell'immagine da caricare e che il Panel abbia la proprietà AutoScroll impostata a True, in quanto tale proprietà permette la visualizzazione e l'utilizzo delle barre di scorrimento se il controllo contenuto nel Panel è di dimensioni maggiori.
    2. La seconda soluzione utilizza soltanto una PictureBox e due barre di scorrimento, una verticale e l'altra orizzontale, con le quali muovere l'immagine per poterla vedere in ogni sua parte.
      L'idea è quella di spostare il punto di inserimento dell'immagine ( punto in alto-sinistra) quando vengono usate le ScrollBar, in modo che quando il cursore delle barre di scorrimento si trova agli estremi, l'immagine è anch'essa ad uno dei suoi estremi ( alto, basso, destra o sinistra).
      Inoltre devono essere rispettate queste condizioni:
      • quando muovo il cursore verso destra l'immagine deve scorrere verso sinistra e viceversa.
      • quando muovo il cursore verso l'alto l'immagine deve scorrere verso il basso e viceversa.
      E' da tenere in considerazione una particolarità delle ScrollBar.
      Esse hanno 4 proprietà che sono importanti per lil loro utilizzo:
      • 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 mantente 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"
    Per vedere in esecuzione il programma è sufficiente avviare un nuovo progetto "Applicazione Windows Form" e incollare il codice sotto riportato:
    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)
    
            'caricamento dell'immagine
            img = Image.FromFile("E:\foto2.jpg")
    
            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 = Image.FromFile("E:\foto1.jpg")
            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
    
    ℹ️ Leggi di più su Gandalfrank ...

  2. #2
    L'avatar di Gandalfrank
    Gandalfrank non è in linea Scribacchino
    Dimenticavo una cosa:
    nel programma vengono caricate 2 immagini nelle PictureBox con queste linee:

    img=Image.FromFile(E:\foto2.jpg")
    ...
    .Image= Image.FromFile("E:\foto1.jpg")
    
    Ovviamente dovete sostituire "E:\foto1.jpg" e "E:\foto2.jpg" con il percorso di due vostre immagini che avete sul PC
    ℹ️ Leggi di più su Gandalfrank ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Scrolling Datagridview
    Da maxottav nel forum Visual Basic .Net
    Risposte: 1
    Ultimo Post: 01-10-2015, 21:27
  2. ListBox Scrolling Slow
    Da PCBase nel forum Visual Basic 6
    Risposte: 18
    Ultimo Post: 10-08-2015, 18:11
  3. scrolling
    Da francof nel forum Visual Basic 6
    Risposte: 18
    Ultimo Post: 13-08-2008, 18:37
  4. Scrolling di una ListWiev
    Da Carmen nel forum Visual Basic 6
    Risposte: 4
    Ultimo Post: 10-04-2008, 00:03
  5. Gestire lo scrolling del mouse
    Da jos nel forum Microsoft Word
    Risposte: 6
    Ultimo Post: 04-09-2006, 22:56