using PaintDotNet.Base.SettingModel; using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Globalization; using System.Runtime.Serialization; using System.Windows.Forms; using PaintDotNet.Base.CommTool; using System.IO; using static PaintDotNet.Base.SettingModel.LabelStyleModel; using PaintDotNet.Annotation.Enum; using System.Collections; using System.Collections.Generic; namespace PaintDotNet.Annotation.Label { /// /// 标注->标记->数字标记 /// public class DrawNumberMark : DrawObject { private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur")); /// /// 标注样式信息model /// public NumberMark labelNumberMarkStyleModel; public int nowNum = 0; public bool canSetNum = false; public DrawNumberMark(ISurfaceBox surfaceBox) : base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawNumberMark; Initialize(); } public DrawNumberMark(ISurfaceBox surfaceBox, int x1, int y1) : base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawNumberMark; startPoint = new PointF(x1, y1); labelNumberMarkStyleModel = surfaceBox.GetLabelStyleModel().numberMark; Initialize(); } public DrawNumberMark(ISurfaceBox surfaceBox, List points, ParentStyleModel parentStyleModel, Object content) : base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawNumberMark; this.ISurfaceBox = surfaceBox; labelNumberMarkStyleModel = (LabelStyleModel.NumberMark)parentStyleModel; startPoint = points[0]; nowNum = Convert.ToInt32(content); } /// /// Clone this instance /// public override DrawObject Clone() { DrawNumberMark numberMark = new DrawNumberMark(ISurfaceBox); numberMark.objectType = DrawClass.Label; numberMark.drawToolType = DrawToolType.DrawNumberMark; numberMark.ISurfaceBox = this.ISurfaceBox; numberMark.startPoint = this.startPoint; numberMark.labelNumberMarkStyleModel = this.labelNumberMarkStyleModel; //numberMark.nowNum = this.nowNum; numberMark.canSetNum = true; FillDrawObjectFields(numberMark); return numberMark; } public override DrawObject Clone(ISurfaceBox surfaceBox) { DrawNumberMark numberMark = new DrawNumberMark(surfaceBox); numberMark.objectType = DrawClass.Label; numberMark.drawToolType = DrawToolType.DrawNumberMark; numberMark.ISurfaceBox = surfaceBox; numberMark.startPoint = this.startPoint; numberMark.labelNumberMarkStyleModel = this.labelNumberMarkStyleModel; //numberMark.nowNum = this.nowNum; numberMark.canSetNum = true; FillDrawObjectFields(numberMark); return numberMark; } public override void Draw(Graphics g) { if (canSetNum) { nowNum = setNowNumber(); canSetNum = false; } Font textfont = new Font(this.labelNumberMarkStyleModel.font, this.labelNumberMarkStyleModel.fontSize); Brush textbrush = new SolidBrush(Color.FromArgb(this.labelNumberMarkStyleModel.textColor)); Color color = Color.FromArgb(this.labelNumberMarkStyleModel.backgroundBoxColor); Pen pen = new Pen(color, this.labelNumberMarkStyleModel.lineWidth); Color fillColor = Color.FromArgb(this.labelNumberMarkStyleModel.backgroundColor); SolidBrush fillBrush = new SolidBrush(fillColor); Size fontSize = g.MeasureString(nowNum.ToString(), textfont).ToSize(); float backgroundSize = 0;//背景大小 if (fontSize.Width > fontSize.Height) backgroundSize = fontSize.Width * (this.labelNumberMarkStyleModel.backgroundSize / 100f); else backgroundSize = fontSize.Height * (this.labelNumberMarkStyleModel.backgroundSize / 100f); g.SmoothingMode = SmoothingMode.AntiAlias; rectangle.X = startPoint.X; rectangle.Y = startPoint.Y; rectangle.Width = fontSize.Width + 2 * backgroundSize; rectangle.Height = fontSize.Height + 2 * backgroundSize; g.FillRectangle(fillBrush, rectangle); g.DrawRectangle(pen, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); g.DrawString(nowNum.ToString(), textfont, textbrush, startPoint.X + backgroundSize, startPoint.Y + backgroundSize); fillBrush.Dispose(); pen.Dispose(); } public int setNowNumber() { List objList = this.ISurfaceBox.GraphicsList.GetDrawToolTypeList(DrawToolType.DrawNumberMark); objList.Reverse(); int indexNum = objList.IndexOf(this) + 1; return indexNum; } public override int HandleCount { get { return 1; } } /// /// Get handle pointscroll by 1-based number /// /// /// public override PointF GetHandle(int handleNumber) { return startPoint; } /// /// Hit test. /// Return value: -1 - no hit /// 0 - hit anywhere /// > 1 - handle number /// /// /// public override int HitTest(Point point) { if (Selected) { for (int i = 1; i <= HandleCount; i++) { if (GetHandleRectangle(i).Contains(point)) return i; } } if (PointInObject(point)) return 0; return -1; } protected override bool PointInObject(Point point) { return rectangle.Contains(point); } public override bool IntersectsWith(Rectangle rectangle) { return Rectangle.IntersectsWith(rectangle); } public override Cursor GetHandleCursor(int handleNumber) { return Cursors.Default; } public override void MoveHandleTo(Point point, int handleNumber) { startPoint = point; } public override void Move(int deltaX, int deltaY) { int x = ISurfaceBox.UnscaleScalar(deltaX); int y = ISurfaceBox.UnscaleScalar(deltaY); startPoint.X += x; startPoint.Y += y; rectangle.X += x; rectangle.Y += y; } public override RectangleF GetBoundingBox() { return rectangle; } public override List GetPoints() { List points = new List(); points.Add(startPoint); return points; } public override ParentStyleModel GetStyle() { return labelNumberMarkStyleModel; } public override string GetContent() { return nowNum.ToString(); } } }