如何在 vb.net 中使用滚轮放大图片框

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/13496706/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-09 16:26:39  来源:igfitidea点击:

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

vb.netvb.net-2010

提问by Greg Willard

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 to autoscroll. What I need to know how to do now is use the Mouse scroll wheel to blow up the size of the picture in small increments while maintaining the quality of the image drawn. Anyone know how to do this?

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

When I update with Abdias Software code below, the picture starts out smaller when Sizemode property of picturebox is set to StretchImage. I have a pan feature with the mouse that might be interfering with keeping this code from working properly. Any Ideas? What could be keeping this from working properly?

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

SOLVED

解决了

This code worked much better for me than any of the two below:

这段代码对我来说比以下两个代码都好得多:

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

采纳答案by Greg Willard

You can try this code. It assumes there exist a Panel1and PictureBox1on the form (PictureBox1inside the Panel1with Panel1.AutoScroll = True) with an image set on the PictureBox.

你可以试试这个代码。它假设在表单上(在with 内)存在一个Panel1and 并且PictureBox1在 上设置了一个图像。PictureBox1Panel1Panel1.AutoScroll = TruePictureBox

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

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

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():

旧代码 - 有效,但可能由于 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

回答by tbm0115

I noticed that there's an undesirable effect with the StretchImageSizeModethat ignores the image ratio. I just added a width and height ratio variable to include in the "zoom" algorithm. See _ratWidthand _ratHeightin code below.

我注意到StretchImageSizeMode忽略图像比例会产生不良影响。我刚刚添加了一个宽高比变量以包含在“缩放”算法中。请参阅_ratWidth_ratHeight在下面的代码中。

Public Class Form1

Private _originalSize As Size = Nothing
Private _scale As Single = 1
Private _scaleDelta As Single = 0.0005
Private _ratWidth, _ratHeight As Double

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 * _ratWidth) * _scale)), _
                                CInt(Math.Round((_originalSize.Height * _ratHeight) * _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
        _ratWidth = PictureBox1.Image.Width / PictureBox1.Image.Height
        _ratHeight = PirctureBox1.Image.Height / PictureBox1.Image.Width
        PictureBox1.Size = Panel1.Size
        _originalSize = Panel1.Size
    End If
End Sub
End Class

回答by urlreader

basically, you need an image viewer. I used this before: http://cyotek.com/blog/creating-a-scrollable-and-zoomable-image-viewer-in-csharp-part-4

基本上,您需要一个图像查看器。我以前用过这个:http: //cyotek.com/blog/creating-a-scrollable-and-zoomable-image-viewer-in-csharp-part-4

it works great. however, it is an user control.

它很好用。然而,它是一个用户控件。

for picturebox, you need create graphics from the image, and then interpolation it. here is an example: http://www.dotnetcurry.com/ShowArticle.aspx?ID=196

对于图片框,您需要从图像创建图形,然后对其进行插值。这是一个例子:http: //www.dotnetcurry.com/ShowArticle.aspx?ID=196

I did not check this one, but looks like will work.

我没有检查这个,但看起来会起作用。