如何在vb.net中使用滚轮放大Picturebox

Gre*_*ard 8 vb.net vb.net-2010

我正在使用一组图形叠加来使用图形对象在图片框控件内绘制图像.我已将Picturebox放在Panel中,并将Panel设置为自动滚动.我现在需要知道的是使用鼠标滚轮以小幅度增大图片的大小,同时保持绘制图像的质量.有人知道怎么做吗?

当我使用下面的Abdias软件代码更新时,当picturebox的Sizemode属性设置为StretchImage时,图片开始变小.我有鼠标的平移功能可能会干扰保持此代码无法正常工作.有任何想法吗?有什么可以阻止它正常工作?

解决了

对于我来说,这段代码比以下任何一个都好得多:

Private Sub PictureBox_MouseWheel(sender As System.Object,
                             e As MouseEventArgs) Handles PictureBox1.MouseWheel
    If e.Delta <> 0 Then
        If e.Delta <= 0 Then
            If PictureBox1.Width < 500 Then Exit Sub 'minimum 500?
        Else
            If PictureBox1.Width > 2000 Then Exit Sub 'maximum 2000?
        End If

        PictureBox1.Width += CInt(PictureBox1.Width * e.Delta / 1000)
        PictureBox1.Height += CInt(PictureBox1.Height * e.Delta / 1000)
    End If

End Sub
Run Code Online (Sandbox Code Playgroud)

小智 6

您可以尝试此代码。假设存在一个Panel1PictureBox1形式(PictureBox1Panel1with内Panel1.AutoScroll = True),并且在上设置了一个图像PictureBox

该代码不会计算缩放的中心点,但是您可以为此使用e.Location(或eX / eY)。

更新-这是(应该)比以前的代码更健壮的新代码(请参阅底部):

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
Run Code Online (Sandbox Code Playgroud)

旧代码-可以工作,但由于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
Run Code Online (Sandbox Code Playgroud)