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.Startup; using PaintDotNet.Base.CommTool; using System.IO; using static PaintDotNet.Base.SettingModel.LabelStyleModel; using PaintDotNet.Annotation.Enum; using System.Collections.Generic; using PaintDotNet.Base.Enum; namespace PaintDotNet.Annotation.Label { /// /// 标注->标记->日期 /// public class DrawDateMark : DrawObject { private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur")); /// /// 标注样式信息model /// public DateMark labelDateMarkStyleModel; /// /// 日期信息 /// private string dateStr = ""; /// /// 辅助为第一次创建日期对象赋值 /// public bool isFirstClick = true; public DrawDateMark(ISurfaceBox surfaceBox) : base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawDateMark; Initialize(); } public DrawDateMark(ISurfaceBox surfaceBox, string nowDate) : base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawDateMark; dateStr = nowDate; labelDateMarkStyleModel = surfaceBox.GetLabelStyleModel().dateMark; startPoint = new PointF(0, 0); Initialize(); } public DrawDateMark(ISurfaceBox surfaceBox, List points, ParentStyleModel parentStyleModel, Object content) : base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawDateMark; this.ISurfaceBox = surfaceBox; labelDateMarkStyleModel = (LabelStyleModel.DateMark)parentStyleModel; startPoint = points[0]; dateStr = content.ToString(); isFirstClick = false; } /// /// Clone this instance /// public override DrawObject Clone() { DrawDateMark dateMark = new DrawDateMark(ISurfaceBox); dateMark.objectType = DrawClass.Label; dateMark.drawToolType = DrawToolType.DrawDateMark; dateMark.ISurfaceBox = ISurfaceBox; dateMark.startPoint = this.startPoint; dateMark.dateStr = this.dateStr; dateMark.isFirstClick = false; dateMark.labelDateMarkStyleModel = this.labelDateMarkStyleModel; FillDrawObjectFields(dateMark); return dateMark; } public override DrawObject Clone(ISurfaceBox surfaceBox) { DrawDateMark dateMark = new DrawDateMark(surfaceBox); dateMark.objectType = DrawClass.Label; dateMark.drawToolType = DrawToolType.DrawDateMark; dateMark.ISurfaceBox = surfaceBox; dateMark.startPoint = this.startPoint; dateMark.dateStr = this.dateStr; dateMark.isFirstClick = false; dateMark.labelDateMarkStyleModel = this.labelDateMarkStyleModel; FillDrawObjectFields(dateMark); return dateMark; } public override void Draw(Graphics g) { g.SmoothingMode = SmoothingMode.AntiAlias; Font textfont = new Font(this.labelDateMarkStyleModel.font, this.labelDateMarkStyleModel.fontSize); Brush textbrush = new SolidBrush(Color.FromArgb(this.labelDateMarkStyleModel.textColor)); Color color = Color.FromArgb(this.labelDateMarkStyleModel.backgroundBoxColor); Pen pen = new Pen(color, this.labelDateMarkStyleModel.lineWidth); Color fillColor = Color.FromArgb(this.labelDateMarkStyleModel.backgroundColor); SolidBrush fillBrush = new SolidBrush(fillColor); Size fontSize = g.MeasureString(dateStr, textfont).ToSize(); float positionSize = 0;//位置大小 float backgroundSize = 0;//背景大小 if(fontSize.Width > fontSize.Height) { positionSize = fontSize.Width * (this.labelDateMarkStyleModel.positionSize / 100f); backgroundSize = fontSize.Width * (this.labelDateMarkStyleModel.backgroundSize / 100f); } else { positionSize = fontSize.Height * (this.labelDateMarkStyleModel.positionSize / 100f); backgroundSize = fontSize.Height * (this.labelDateMarkStyleModel.backgroundSize / 100f); } if (isFirstClick) { string gainPosition = this.labelDateMarkStyleModel.position; SizeF windowSize = this.ISurfaceBox.GetDocumentSize(); switch ((TagLocation)System.Enum.ToObject(typeof(TagLocation), int.Parse(gainPosition))) { case TagLocation.UpLeft: startPoint.X = 0 + positionSize; startPoint.Y = 0 + positionSize; break; case TagLocation.UpRight: startPoint.X = Convert.ToInt32(windowSize.Width) - fontSize.Width - 2 * backgroundSize - positionSize; startPoint.Y = 0 + positionSize; break; case TagLocation.DownLeft: startPoint.X = 0 + positionSize; startPoint.Y = Convert.ToInt32(windowSize.Height) - fontSize.Height - 2 * backgroundSize - positionSize; break; case TagLocation.DownRight: startPoint.X = Convert.ToInt32(windowSize.Width) - fontSize.Width - 2 * backgroundSize - positionSize; startPoint.Y = Convert.ToInt32(windowSize.Height) - fontSize.Height - 2 * backgroundSize - positionSize; break; } isFirstClick = false; } g.FillRectangle(fillBrush, startPoint.X, startPoint.Y, fontSize.Width + 2 * backgroundSize, fontSize.Height + 2 * backgroundSize); g.DrawRectangle(pen, startPoint.X, startPoint.Y, fontSize.Width + 2 * backgroundSize, fontSize.Height + 2 * backgroundSize); g.DrawString(dateStr, textfont, textbrush, startPoint.X + backgroundSize, startPoint.Y + backgroundSize); rectangle.X = startPoint.X; rectangle.Y = startPoint.Y; rectangle.Width = fontSize.Width + 2 * backgroundSize; rectangle.Height = fontSize.Height + 2 * backgroundSize; fillBrush.Dispose(); pen.Dispose(); } 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 labelDateMarkStyleModel; } public override string GetContent() { return dateStr; } } }