using PaintDotNet.Base.SettingModel; using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; 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 DrawGainNumber : DrawObject { private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur")); /// /// 标注样式信息model /// public GainNumber labelGainNumberStyleModel; /// /// 放大倍数输出信息 /// private string stringMsg = ""; /// /// 辅助为第一次创建放大倍数对象赋值 /// public bool isFirstClick = true; public DrawGainNumber(ISurfaceBox surfaceBox) : base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawGainNumber; labelGainNumberStyleModel = surfaceBox.GetLabelStyleModel().gainNumber; startPoint = new PointF(0, 0); Initialize(); } public DrawGainNumber(ISurfaceBox surfaceBox, List points, ParentStyleModel parentStyleModel, Object content) : base() { this.objectType = DrawClass.Label; this.drawToolType = DrawToolType.DrawGainNumber; this.ISurfaceBox = surfaceBox; labelGainNumberStyleModel = (GainNumber)parentStyleModel; startPoint = points[0]; stringMsg = content.ToString(); isFirstClick = false; } /// /// Clone this instance /// public override DrawObject Clone() { DrawGainNumber gainNumber = new DrawGainNumber(ISurfaceBox); gainNumber.objectType = DrawClass.Label; gainNumber.drawToolType = DrawToolType.DrawGainNumber; gainNumber.ISurfaceBox = ISurfaceBox; gainNumber.startPoint = this.startPoint; gainNumber.stringMsg = this.stringMsg; gainNumber.isFirstClick = false; FillDrawObjectFields(gainNumber); return gainNumber; } public override DrawObject Clone(ISurfaceBox surfaceBox) { DrawGainNumber gainNumber = new DrawGainNumber(surfaceBox); gainNumber.objectType = DrawClass.Label; gainNumber.drawToolType = DrawToolType.DrawGainNumber; gainNumber.ISurfaceBox = surfaceBox; gainNumber.startPoint = this.startPoint; gainNumber.stringMsg = this.stringMsg; gainNumber.isFirstClick = false; gainNumber.labelGainNumberStyleModel = this.labelGainNumberStyleModel; FillDrawObjectFields(gainNumber); return gainNumber; } public override void Draw(Graphics g) { g.SmoothingMode = SmoothingMode.AntiAlias; stringMsg = PdnResources.GetString("Menu.ImageOverlays.line.Takepictures.text") + ":" + ISurfaceBox.GetMic_Rulers().ToString("f2") + "X"; Font textfont = new Font(this.labelGainNumberStyleModel.font, this.labelGainNumberStyleModel.fontSize); Brush textbrush = new SolidBrush(Color.FromArgb(this.labelGainNumberStyleModel.textColor)); Color color = Color.FromArgb(this.labelGainNumberStyleModel.backgroundBoxColor); Pen pen = new Pen(color, this.labelGainNumberStyleModel.lineWidth); Color fillColor = Color.FromArgb(this.labelGainNumberStyleModel.backgroundColor); SolidBrush fillBrush = new SolidBrush(fillColor); Size fontSize = g.MeasureString(stringMsg, textfont).ToSize(); float positionSize = 0;//位置大小 float backgroundSize = 0;//背景大小 if (fontSize.Width > fontSize.Height) { positionSize = fontSize.Width * (this.labelGainNumberStyleModel.positionSize / 100f); backgroundSize = fontSize.Width * (this.labelGainNumberStyleModel.backgroundSize / 100f); } else { positionSize = fontSize.Height * (this.labelGainNumberStyleModel.positionSize / 100f); backgroundSize = fontSize.Height * (this.labelGainNumberStyleModel.backgroundSize / 100f); } if (isFirstClick) { string gainPosition = this.labelGainNumberStyleModel.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(stringMsg, 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 labelGainNumberStyleModel; } public override string GetContent() { return stringMsg; } } }