Bueno, con el siguiente ejemplo que he desarrollado ya deberías tener por donde continuarlo para satisfacer tus requisitos:
Public Class PictureBoxEx : Inherits PictureBox
Protected isMoving As Boolean ' Flag that determine whether the image is moving.
Protected ptStart As Point ' Point where image moving starts.
Protected ptMove As Point ' Point where image moving is at.
Protected ptEnd As Point ' Point where image moving ends.
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
If (e.Button = MouseButtons.Left) Then
Me.ptStart = New Point(e.X, e.Y)
Me.isMoving = True
End If
MyBase.OnMouseDown(e)
End Sub
Protected Overrides Sub OnMouseUp(e As MouseEventArgs)
Me.Update()
Me.isMoving = False
Me.ptEnd = Me.ptMove
MyBase.OnMouseUp(e)
End Sub
Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
If (Me.isMoving) AndAlso (Me.Image IsNot Nothing) Then
Me.ptMove = New Point(Me.ptEnd.X + (e.X - Me.ptStart.X), Me.ptEnd.Y + (e.Y - Me.ptStart.Y))
Me.Invalidate()
End If
MyBase.OnMouseMove(e)
End Sub
Protected Overrides Sub OnPaint(pe As PaintEventArgs)
If (Me.isMoving) AndAlso (Me.Image IsNot Nothing) Then
With pe.Graphics
.TranslateTransform(Me.ptMove.X, Me.ptMove.Y)
.DrawImage(Me.Image, Point.Empty)
End With
End If
MyBase.OnPaint(pe)
End Sub
End Class
PD: nótese que para el ejemplo de arriba utilizo la imagen especificada en la propiedad
PictureBox.Image, pero puedes hacer lo mismo con la imagen de la propiedad
PictureBox.BackgroundImage.
Saludos.