-
Pannable PictureBox
This code ignores image stretching and doesn't support zooming, but if you need a picture box where you can pan the image (or offset it to show only part of the image you load in to it) then here is code that is working great for me!
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CustomControls
{
class PannablePictureBox : System.Windows.Forms.PictureBox
{
private int _OffsetX = 0;
private int _OffsetY = 0;
public int OffsetX
{
get
{
return _OffsetX;
}
set
{
if(Image != null)
{
if(value > Image.Width - this.Width)
_OffsetX = Math.Max(Image.Width - this.Width, 0);
else
_OffsetX = Math.Max(0, value);
}
this.Invalidate();
}
}
public int OffsetY
{
get
{
return _OffsetY;
}
set
{
if(Image != null)
{
if(value > Image.Height - this.Height)
_OffsetY = Math.Max(Image.Height - this.Height, 0);
else
_OffsetY = Math.Max(0, value);
}
this.Invalidate();
}
}
public new System.Drawing.Image Image
{
get { return base.Image; }
set
{
base.Image = value;
if(value == null || _OffsetX > value.Width || _OffsetY > value.Height)
{
_OffsetX = 0;
_OffsetY = 0;
}
}
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
OffsetX = OffsetX; // Make sure the pic still fits
OffsetY = OffsetY;
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs pe)
{
base.OnPaint(pe);
this.SuspendLayout();
pe.Graphics.FillRectangle(new System.Drawing.SolidBrush(this.BackColor), pe.ClipRectangle);
System.Drawing.Rectangle DestinationRect = GetDestinationRectangle(pe.ClipRectangle);
if(DestinationRect != System.Drawing.Rectangle.Empty)
{
pe.Graphics.DrawImage(this.Image, 0, 0, DestinationRect, System.Drawing.GraphicsUnit.Pixel);
}
this.ResumeLayout();
}
private System.Drawing.Rectangle GetDestinationRectangle(System.Drawing.Rectangle SourceRectangle)
{
if(this.Image == null) return System.Drawing.Rectangle.Empty;
if(SourceRectangle.Top > Image.Height - _OffsetY) return System.Drawing.Rectangle.Empty;
if(SourceRectangle.Left > Image.Width - _OffsetX) return System.Drawing.Rectangle.Empty;
int Top = 0;
int Height = 0;
int Left = 0;
int Width = 0;
Top = SourceRectangle.Top + _OffsetY;
Height = Math.Min(SourceRectangle.Height, Image.Height - Top);
Left = SourceRectangle.Left + _OffsetX;
Width = Math.Min(SourceRectangle.Width, Image.Width - Left);
return new System.Drawing.Rectangle(Left, Top, Width, Height);
}
}
}
-
Re: Pannable PictureBox
Thanks for Sharing my problem here, please more explanation