How to pan Image inside PictureBox
I think the math is backwards. Try it like this:
private Point startingPoint = Point.Empty;
private Point movingPoint = Point.Empty;
private bool panning = false;
void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
panning = true;
startingPoint = new Point(e.Location.X - movingPoint.X,
e.Location.Y - movingPoint.Y);
}
void pictureBox1_MouseUp(object sender, MouseEventArgs e) {
panning = false;
}
void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
if (panning) {
movingPoint = new Point(e.Location.X - startingPoint.X,
e.Location.Y - startingPoint.Y);
pictureBox1.Invalidate();
}
}
void pictureBox1_Paint(object sender, PaintEventArgs e) {
e.Graphics.Clear(Color.White);
e.Graphics.DrawImage(Image, movingPoint);
}
You aren't disposing your graphic object, and CreateGraphics is just a temporary drawing anyway (minimizing would erase it) so I moved the drawing code to the Paint event and am just invalidating as the user is panning.
EMBEDONIX
Protecting yourself against thrown exceptions, considered as a defensive programming practice.
Updated on June 04, 2022Comments
-
EMBEDONIX almost 2 years
I have a custom
PictureBox
which can zoom in usingMouseWheel
event. Now I want to add a panning feature to it. I mean when PictureBox is in zoomed state, if user left clicks and holds the click then move the mouse, the image would pan within the picturebox.Here is my code but unfortunately it does not work! I don't know where to look anymore...
private Point _panStartingPoint = Point.Empty; private bool _panIsActive; private void CurveBox_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Focus(); _panIsActive = true; _panStartingPoint = e.Location; } } private void CurveBox_MouseUp(object sender, MouseEventArgs e) { _panIsActive = false; } private void CurveBox_MouseLeave(object sender, EventArgs e) { _panIsActive = false; } private void CurveBox_MouseMove(object sender, MouseEventArgs e) { if(_panIsActive && IsZoomed) { var g = CreateGraphics(); //Create graphics from PictureBox var nx = _panStartingPoint.X + e.X; var ny = _panStartingPoint.Y + e.Y; var sourceRectangle = new Rectangle(nx, ny, Image.Width, Image.Height); g.DrawImage(Image, nx, ny, sourceRectangle, GraphicsUnit.Pixel); } }
I am suspecting the
MouseMove
event...I am not sure if anything happens in this event and/ornx
andny
does contain correct point.Any helps/tips is really appriciated!