Prevent panning from moving canvas offscreen

This commit is contained in:
L1Q 2017-11-08 19:03:56 +02:00
parent f0e5416e0d
commit 4b6d40ca20
2 changed files with 28 additions and 0 deletions

View file

@ -56,6 +56,7 @@ public sealed class RegionCaptureForm : Form
public bool IsAnnotated => ShapeManager != null && ShapeManager.IsAnnotated;
public Point CurrentPosition { get; private set; }
public Point PanningStrech = new Point();
public Color CurrentColor
{
@ -327,6 +328,32 @@ private void OnMoved()
private void Pan(int deltaX, int deltaY)
{
PanningStrech.X -= deltaX;
PanningStrech.Y -= deltaY;
int panLimit = 100;
Size panLimitSize = new Size(
Math.Min(panLimit, CanvasRectangle.Width),
Math.Min(panLimit, CanvasRectangle.Height));
Rectangle limitRectangle = new Rectangle(
ClientArea.X + panLimitSize.Width, ClientArea.Y + panLimitSize.Height,
ClientArea.Width - panLimitSize.Width * 2, ClientArea.Height - panLimitSize.Height * 2);
deltaX = Math.Max(deltaX, limitRectangle.Left - CanvasRectangle.Right);
deltaX = Math.Min(deltaX, limitRectangle.Right - CanvasRectangle.Left);
deltaY = Math.Max(deltaY, limitRectangle.Top - CanvasRectangle.Bottom);
deltaY = Math.Min(deltaY, limitRectangle.Bottom - CanvasRectangle.Top);
deltaX -= Math.Min(Math.Max(deltaX, 0), Math.Max(0, PanningStrech.X));
deltaX -= Math.Max(Math.Min(deltaX, 0), Math.Min(0, PanningStrech.X));
deltaY -= Math.Min(Math.Max(deltaY, 0), Math.Max(0, PanningStrech.Y));
deltaY -= Math.Max(Math.Min(deltaY, 0), Math.Min(0, PanningStrech.Y));
PanningStrech.X += deltaX;
PanningStrech.Y += deltaY;
CanvasRectangle = CanvasRectangle.LocationOffset(deltaX, deltaY);
if (backgroundBrush != null)

View file

@ -738,6 +738,7 @@ private void EndRegionSelection()
private void StartPanning()
{
IsPanning = true;
form.PanningStrech = new Point(0, 0);
form.Cursor = Cursors.SizeAll;
}