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 DrawTimeMark : DrawObject { private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur")); /// /// 标注样式信息model /// public TimeMark labelTimeMarkStyleModel; /// /// 时间信息 /// private string timeStr = ""; /// /// 辅助为第一次创建时间对象赋值 /// public bool isFirstClick = true; public DrawTimeMark(ISurfaceBox surfaceBox) : base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawTimeMark; Initialize(); } public DrawTimeMark(ISurfaceBox surfaceBox, string nowTime) : base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawTimeMark; timeStr = nowTime; labelTimeMarkStyleModel = surfaceBox.GetLabelStyleModel().timeMark; startPoint = new PointF(0, 0); Initialize(); } public DrawTimeMark(ISurfaceBox surfaceBox, List points, ParentStyleModel parentStyleModel, Object content) :base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawTimeMark; this.ISurfaceBox = surfaceBox; labelTimeMarkStyleModel = (LabelStyleModel.TimeMark)parentStyleModel; startPoint = points[0]; timeStr = content.ToString(); isFirstClick = false; } /// /// Clone this instance /// public override DrawObject Clone() { DrawTimeMark timeMark = new DrawTimeMark(ISurfaceBox); timeMark.objectType = DrawClass.Label; timeMark.drawToolType = DrawToolType.DrawTimeMark; timeMark.ISurfaceBox = this.ISurfaceBox; timeMark.startPoint = this.startPoint; timeMark.timeStr = this.timeStr; timeMark.isFirstClick = false; timeMark.labelTimeMarkStyleModel = this.labelTimeMarkStyleModel; FillDrawObjectFields(timeMark); return timeMark; } public override DrawObject Clone(ISurfaceBox surfaceBox) { DrawTimeMark timeMark = new DrawTimeMark(surfaceBox); timeMark.objectType = DrawClass.Label; timeMark.drawToolType = DrawToolType.DrawTimeMark; timeMark.ISurfaceBox = surfaceBox; timeMark.startPoint = this.startPoint; timeMark.timeStr = this.timeStr; timeMark.isFirstClick = false; timeMark.labelTimeMarkStyleModel = this.labelTimeMarkStyleModel; FillDrawObjectFields(timeMark); return timeMark; } public override void Draw(Graphics g) { g.SmoothingMode = SmoothingMode.AntiAlias; Font textfont = new Font(this.labelTimeMarkStyleModel.font, this.labelTimeMarkStyleModel.fontSize); Brush textbrush = new SolidBrush(Color.FromArgb(this.labelTimeMarkStyleModel.textColor)); Color color = Color.FromArgb(this.labelTimeMarkStyleModel.backgroundBoxColor); Pen pen = new Pen(color, this.labelTimeMarkStyleModel.lineWidth); Color fillColor = Color.FromArgb(this.labelTimeMarkStyleModel.backgroundColor); SolidBrush fillBrush = new SolidBrush(fillColor); Size fontSize = g.MeasureString(timeStr, textfont).ToSize(); float positionSize = 0;//位置大小 float backgroundSize = 0;//背景大小 if (fontSize.Width > fontSize.Height) { positionSize = fontSize.Width * (this.labelTimeMarkStyleModel.positionSize / 100f); backgroundSize = fontSize.Width * (this.labelTimeMarkStyleModel.backgroundSize / 100f); } else { positionSize = fontSize.Height * (this.labelTimeMarkStyleModel.positionSize / 100f); backgroundSize = fontSize.Height * (this.labelTimeMarkStyleModel.backgroundSize / 100f); } if (isFirstClick) { string gainPosition = this.labelTimeMarkStyleModel.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(timeStr, 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 labelTimeMarkStyleModel; } public override string GetContent() { return timeStr; } } }