using System.Drawing; using System.Windows.Forms; namespace PaintDotNet.Measurement.Tools { /// /// 平移工具(手型) /// public class PanTool : Tool { private bool tracking = false; private Point lastMouseXY; private Cursor cursorMouseDown; private Cursor cursorMouseUp; private Cursor cursorMouseInvalid; private int ignoreMouseMove = 0; private bool CanPan() { if (DocumentWorkspace.GetVisibleDocumentRectangleF().Size == Document.Size) { return false; } else { return true; } } protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); lastMouseXY = new Point(e.X, e.Y); tracking = true; if (CanPan()) { Cursor = cursorMouseDown; } else { Cursor = cursorMouseInvalid; } } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); if (CanPan()) { Cursor = cursorMouseUp; } else { Cursor = cursorMouseInvalid; } tracking = false; } protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (this.ignoreMouseMove > 0) { --this.ignoreMouseMove; } else if (tracking) { Point mouseXY = new Point(e.X, e.Y); Size delta = new Size(mouseXY.X - lastMouseXY.X, mouseXY.Y - lastMouseXY.Y); if (delta.Width != 0 || delta.Height != 0) { PointF scrollPos = DocumentWorkspace.GetDocumentScrollPositionF(); PointF newScrollPos = new PointF(scrollPos.X - delta.Width, scrollPos.Y - delta.Height); ++this.ignoreMouseMove; // setting DocumentScrollPosition incurs a MouseMove event DocumentWorkspace.SetDocumentScrollPositionF(newScrollPos); lastMouseXY = mouseXY; lastMouseXY.X -= delta.Width; lastMouseXY.Y -= delta.Height; } } else { if (CanPan()) { Cursor = cursorMouseUp; } else { Cursor = cursorMouseInvalid; } } } protected override void OnActivate() { // cursor-action assignments this.cursorMouseDown = new Cursor(PdnResources.GetResourceStream("Cursors.PanToolCursorMouseDown.cur")); this.cursorMouseUp = new Cursor(PdnResources.GetResourceStream("Cursors.PanToolCursor.cur")); this.cursorMouseInvalid = new Cursor(PdnResources.GetResourceStream("Cursors.PanToolCursorInvalid.cur")); this.Cursor = cursorMouseUp; base.OnActivate(); } protected override void OnDeactivate() { if (cursorMouseDown != null) { cursorMouseDown.Dispose(); cursorMouseDown = null; } if (cursorMouseUp != null) { cursorMouseUp.Dispose(); cursorMouseUp = null; } if (cursorMouseInvalid != null) { cursorMouseInvalid.Dispose(); cursorMouseInvalid = null; } base.OnDeactivate(); } public PanTool(IDocumentWorkspace documentWorkspace) : base(documentWorkspace, PdnResources.GetImageResource("Icons.PanToolIcon.png"), PdnResources.GetString("PanTool.Name"), PdnResources.GetString("PanTool.HelpText"), 'h', false, ToolBarConfigItems.None) { autoScroll = false; tracking = false; } } }