如何在vb中放大可滚动面板内的图像

时间:2015-05-27 17:48:06

标签: vb.net image scroll panel picturebox

我有一个可滚动的面板,里面有图片/图片框

我想放大并缩小图像,而按钮不会消失在面板的左下方。顺便说一下,图片的实际尺寸。

如果我将它设置为可以放大和缩小的可滚动面板,我是否仍然可以通过不使用屏幕坐标而不是实际图像的坐标来获取图像的坐标?

请帮助我

1 个答案:

答案 0 :(得分:0)

我不确定你的意思

  

在没有按钮消失的情况下放大和缩小图像

但是你可以使用Bob Powell创建的这个控件。他的网站现在似乎已离线,但我找到了这段代码:

Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Windows.Forms


Namespace bobpowell.net
   '/ <summary>
   '/ ZoomPicBox does what it says on the wrapper.
   '/ </summary>
   '/ <remarks>
   '/ PictureBox doesn't lend itself well to overriding. Why not start with something basic and do the job properly?
   '/ </remarks>

   Public Class ZoomPicBox
    Inherits ScrollableControl

    Private _image As Image

    <Category("Appearance"), Description("The image to be displayed")>  _
    Public Property Image() As Image
     Get
      Return _image
     End Get
     Set
      _image = value
      UpdateScaleFactor()
      Invalidate()
     End Set
    End Property

    Private _zoom As Single = 1F

    <Category("Appearance"), Description("The zoom factor. Less than 1 to reduce. More than 1 to magnify.")>  _
    Public Property Zoom() As Single
     Get
      Return _zoom
     End Get
     Set
      If value < 0 OrElse value < 1E-05 Then
         value = 1E-05F
      End If
      _zoom = value
      UpdateScaleFactor()
      Invalidate()
     End Set
    End Property


    Private Sub UpdateScaleFactor()
     If _image Is Nothing Then
      Me.AutoScrollMargin = Me.Size
     Else
      Me.AutoScrollMinSize = New Size(CInt(Me._image.Width * _zoom + 0.5F), CInt(Me._image.Height * _zoom + 0.5F))
     End If
    End Sub 'UpdateScaleFactor

    Private _interpolationMode As InterpolationMode = InterpolationMode.High

    <Category("Appearance"), Description("The interpolation mode used to smooth the drawing")>  _
    Public Property InterpolationMode() As InterpolationMode
     Get
      Return _interpolationMode
     End Get
     Set
      _interpolationMode = value
     End Set
    End Property


    Protected Overrides Sub OnPaintBackground(pevent As PaintEventArgs)
    End Sub 'OnPaintBackground

    ' do nothing.

    Protected Overrides Sub OnPaint(e As PaintEventArgs)
     'if no image, don't bother
     If _image Is Nothing Then
      MyBase.OnPaintBackground(e)
      Return
     End If
     'Set up a zoom matrix
     Dim mx As New Matrix(_zoom, 0, 0, _zoom, 0, 0)
     mx.Translate(Me.AutoScrollPosition.X / _zoom, Me.AutoScrollPosition.Y / _zoom)
     e.Graphics.Transform = mx
     e.Graphics.InterpolationMode = _interpolationMode
     e.Graphics.DrawImage(_image, New Rectangle(0, 0, Me._image.Width, Me._image.Height), 0, 0, _image.Width, _image.Height, GraphicsUnit.Pixel)
     MyBase.OnPaint(e)
    End Sub 'OnPaint


    Public Sub New()
     'Double buffer the control
     Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw Or ControlStyles.UserPaint Or ControlStyles.DoubleBuffer, True)

     Me.AutoScroll = True
    End Sub 'New
   End Class 'ZoomPicBox
End Namespace 'bobpowell.net