using PaintDotNet.Annotation.Enum; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.Globalization; using System.Runtime.Serialization; using System.Windows.Forms; namespace PaintDotNet.Annotation.FieldView { /// /// 正方形视场绘制 /// public class ViewSquare : ViewBase { public override double Width { get { return Rectangle.Width; } set { MoveHandleTo(new PointF((float)(Points[0].X + value), (float)(Points[0].Y + value)), 3); } } #region Constructor public ViewSquare() { objectType = DrawClass.View; drawToolType = DrawToolType.ViewSquare; Initialize(); } public ViewSquare(int x, int y) : this() { for (int i = 0; i < 4; i++) AddPoint(x, y); } public ViewSquare(List points) : this() { Points = points; } #endregion #region Handles public override int HandleCount => Points.Count; public override PointF GetHandle(int handleIndex) { return Points[handleIndex - 1]; } public override Cursor GetHandleCursor(int handleNumber) { switch (handleNumber) { case 1: return Cursors.SizeNWSE; case 2: return Cursors.SizeNESW; case 3: return Cursors.SizeNWSE; case 4: return Cursors.SizeNESW; default: return Cursors.Default; } } public override void MoveHandleTo(Point point, int handleNumber) { MoveHandleTo((PointF)point, handleNumber); } public override void MoveHandleTo(PointF point, int handleNumber) { MoveCorner(point, handleNumber - 1); OnPropertyChanged(); } private void MoveCorner(PointF point, int i) { var p0 = Points[(i + 2) % 4]; var lenX = point.X - p0.X; var lenY = point.Y - p0.Y; var len = Math.Max(Math.Abs(lenX), Math.Abs(lenY)); lenX = lenX > 0 ? len : -len; lenY = lenY > 0 ? len : -len; Points[i] = new PointF(p0.X + lenX, p0.Y + lenY); if (i % 2 == 0) { Points[(i + 1) % 4] = new PointF(p0.X + lenX, p0.Y); Points[(i + 3) % 4] = new PointF(p0.X, p0.Y + lenY); } else { Points[(i + 3) % 4] = new PointF(p0.X + lenX, p0.Y); Points[(i + 1) % 4] = new PointF(p0.X, p0.Y + lenY); } } #endregion #region Clone public override DrawObject Clone() { return Clone(ISurfaceBox); } /// /// Clone this instance /// public override DrawObject Clone(ISurfaceBox surfaceBox) { ViewSquare drawRectangle = new ViewSquare(Points); drawRectangle.ISurfaceBox = surfaceBox; drawRectangle.combineMode = this.combineMode; drawRectangle.Color = Color; drawRectangle.ID = ID; FillDrawObjectFields(drawRectangle); return drawRectangle; } #endregion } }