How to zoom in a Picturebox with scrollwheel in vb.net

后端 未结 3 1905
挽巷
挽巷 2020-12-16 03:19

I\'m using a set of graphics overlays to draw an image inside a picturebox control using the graphics object. I have placed the Picturebox inside a Panel and set the Panel t

3条回答
  •  猫巷女王i
    2020-12-16 04:06

    You can try this code. It assumes there exist a Panel1 and PictureBox1 on the form (PictureBox1 inside the Panel1 with Panel1.AutoScroll = True) with an image set on the PictureBox.

    The code doesn't calculate center point of the zoom, but you can use the e.Location (or e.X/e.Y) for that.

    Update - here is the new code that is (should be) more robust than the previous (see bottom):

    Public Class Form1
    
        Private _originalSize As Size = Nothing
        Private _scale As Single = 1
        Private _scaleDelta As Single = 0.0005
    
        Private Sub Form_MouseWheel(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
    
            'if very sensitive mouse, change 0.00005 to something even smaller   
            _scaleDelta = Math.Sqrt(PictureBox1.Width * PictureBox1.Height) * 0.00005
    
            If e.Delta < 0 Then
                _scale -= _scaleDelta
            ElseIf e.Delta > 0 Then
                _scale += _scaleDelta
            End If
    
            If e.Delta <> 0 Then _
            PictureBox1.Size = New Size(CInt(Math.Round(_originalSize.Width * _scale)), _
                                        CInt(Math.Round(_originalSize.Height * _scale)))
    
        End Sub
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
    
            'init this from here or a method depending on your needs
            If PictureBox1.Image IsNot Nothing Then
                PictureBox1.Size = Panel1.Size
                _originalSize = Panel1.Size
            End If
    
        End Sub
    
    End Class
    

    Old code - works, but is unstable on large changes probably due to rounding errors in Scale():

    Public Class Form1
    
        Private _scale As New SizeF(1, 1)
        Private _scaleDelta As New SizeF(0.01, 0.01) '1% for each wheel tick
    
        Private Sub Form_MouseWheel(sender As System.Object, 
                                    e As MouseEventArgs) Handles Me.MouseWheel
    'count incrementally 
            _scale.Height = 1
            _scale.Width = 1
    
            If e.Delta < 0 Then
                _scale += _scaleDelta
            ElseIf e.Delta > 0 Then
                _scale -= _scaleDelta
            End If
    
            If e.Delta <> 0 Then _
            PictureBox1.Scale(_scale)
    
        End Sub
    
        Private Sub Form1_Load(sender As System.Object, 
                               e As EventArgs) Handles MyBase.Load
    
            PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
    
            'init picturebox size = image size
            If PictureBox1.Image IsNot Nothing Then
                PictureBox1.Scale(New SizeF(1, 1))
                PictureBox1.Size = PictureBox1.Image.Size
            End If
    
        End Sub
    
    End Class
    

提交回复
热议问题