how to zoom in the image inside a scrollable panel

2019-09-20 06:03发布

问题:

I have a scrollable panel with an image/picture box inside.

I wanted to zoom in and zoom out the image without the buttons disappearing on the lower left of the panel. by the way, the image is in it's actual size.

If I make it a scrollable panel that can be zoomed in and out, will i still be able to get the coordinates of the image by not using the coordinates of the screen but the coordinates of the actual image?

Pls help me

回答1:

I'm not sure what you mean by

zoom in and zoom out the image without the buttons disappearing

But you can use this control created by Bob Powell. His site seems to be offline now but I found this code:

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