DrawNumberMark.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. using PaintDotNet.Base.SettingModel;
  2. using System;
  3. using System.Drawing;
  4. using System.Drawing.Drawing2D;
  5. using System.Globalization;
  6. using System.Runtime.Serialization;
  7. using System.Windows.Forms;
  8. using PaintDotNet.Base.CommTool;
  9. using System.IO;
  10. using static PaintDotNet.Base.SettingModel.LabelStyleModel;
  11. using PaintDotNet.Annotation.Enum;
  12. using System.Collections;
  13. using System.Collections.Generic;
  14. namespace PaintDotNet.Annotation.Label
  15. {
  16. /// <summary>
  17. /// 标注->标记->数字标记
  18. /// </summary>
  19. public class DrawNumberMark : DrawObject
  20. {
  21. private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur"));
  22. /// <summary>
  23. /// 标注样式信息model
  24. /// </summary>
  25. public NumberMark labelNumberMarkStyleModel;
  26. public int nowNum = 0;
  27. public bool canSetNum = false;
  28. public DrawNumberMark(ISurfaceBox surfaceBox) : base()
  29. {
  30. this.objectType = DrawClass.Label;
  31. this.drawToolType = DrawToolType.DrawNumberMark;
  32. Initialize();
  33. }
  34. public DrawNumberMark(ISurfaceBox surfaceBox, int x1, int y1) : base()
  35. {
  36. this.objectType = DrawClass.Label;
  37. this.drawToolType = DrawToolType.DrawNumberMark;
  38. startPoint = new PointF(x1, y1);
  39. labelNumberMarkStyleModel = surfaceBox.GetLabelStyleModel().numberMark;
  40. Initialize();
  41. }
  42. public DrawNumberMark(ISurfaceBox surfaceBox, List<PointF> points, ParentStyleModel parentStyleModel, Object content) : base()
  43. {
  44. this.objectType = DrawClass.Label;
  45. this.drawToolType = DrawToolType.DrawNumberMark;
  46. this.ISurfaceBox = surfaceBox;
  47. labelNumberMarkStyleModel = (LabelStyleModel.NumberMark)parentStyleModel;
  48. startPoint = points[0];
  49. nowNum = Convert.ToInt32(content);
  50. }
  51. /// <summary>
  52. /// Clone this instance
  53. /// </summary>
  54. public override DrawObject Clone()
  55. {
  56. DrawNumberMark numberMark = new DrawNumberMark(ISurfaceBox);
  57. numberMark.objectType = DrawClass.Label;
  58. numberMark.drawToolType = DrawToolType.DrawNumberMark;
  59. numberMark.ISurfaceBox = this.ISurfaceBox;
  60. numberMark.startPoint = this.startPoint;
  61. numberMark.labelNumberMarkStyleModel = this.labelNumberMarkStyleModel;
  62. //numberMark.nowNum = this.nowNum;
  63. numberMark.canSetNum = true;
  64. FillDrawObjectFields(numberMark);
  65. return numberMark;
  66. }
  67. public override DrawObject Clone(ISurfaceBox surfaceBox)
  68. {
  69. DrawNumberMark numberMark = new DrawNumberMark(surfaceBox);
  70. numberMark.objectType = DrawClass.Label;
  71. numberMark.drawToolType = DrawToolType.DrawNumberMark;
  72. numberMark.ISurfaceBox = surfaceBox;
  73. numberMark.startPoint = this.startPoint;
  74. numberMark.labelNumberMarkStyleModel = this.labelNumberMarkStyleModel;
  75. //numberMark.nowNum = this.nowNum;
  76. numberMark.canSetNum = true;
  77. FillDrawObjectFields(numberMark);
  78. return numberMark;
  79. }
  80. public override void Draw(Graphics g)
  81. {
  82. if (canSetNum)
  83. {
  84. nowNum = setNowNumber();
  85. canSetNum = false;
  86. }
  87. Font textfont = new Font(this.labelNumberMarkStyleModel.font, this.labelNumberMarkStyleModel.fontSize);
  88. Brush textbrush = new SolidBrush(Color.FromArgb(this.labelNumberMarkStyleModel.textColor));
  89. Color color = Color.FromArgb(this.labelNumberMarkStyleModel.backgroundBoxColor);
  90. Pen pen = new Pen(color, this.labelNumberMarkStyleModel.lineWidth);
  91. Color fillColor = Color.FromArgb(this.labelNumberMarkStyleModel.backgroundColor);
  92. SolidBrush fillBrush = new SolidBrush(fillColor);
  93. Size fontSize = g.MeasureString(nowNum.ToString(), textfont).ToSize();
  94. float backgroundSize = 0;//背景大小
  95. if (fontSize.Width > fontSize.Height)
  96. backgroundSize = fontSize.Width * (this.labelNumberMarkStyleModel.backgroundSize / 100f);
  97. else
  98. backgroundSize = fontSize.Height * (this.labelNumberMarkStyleModel.backgroundSize / 100f);
  99. g.SmoothingMode = SmoothingMode.AntiAlias;
  100. rectangle.X = startPoint.X;
  101. rectangle.Y = startPoint.Y;
  102. rectangle.Width = fontSize.Width + 2 * backgroundSize;
  103. rectangle.Height = fontSize.Height + 2 * backgroundSize;
  104. g.FillRectangle(fillBrush, rectangle);
  105. g.DrawRectangle(pen, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height);
  106. g.DrawString(nowNum.ToString(), textfont, textbrush, startPoint.X + backgroundSize, startPoint.Y + backgroundSize);
  107. fillBrush.Dispose();
  108. pen.Dispose();
  109. }
  110. public int setNowNumber()
  111. {
  112. List<DrawObject> objList = this.ISurfaceBox.GraphicsList.GetDrawToolTypeList(DrawToolType.DrawNumberMark);
  113. objList.Reverse();
  114. int indexNum = objList.IndexOf(this) + 1;
  115. return indexNum;
  116. }
  117. public override int HandleCount
  118. {
  119. get
  120. {
  121. return 1;
  122. }
  123. }
  124. /// <summary>
  125. /// Get handle pointscroll by 1-based number
  126. /// </summary>
  127. /// <param name="handleNumber"></param>
  128. /// <returns></returns>
  129. public override PointF GetHandle(int handleNumber)
  130. {
  131. return startPoint;
  132. }
  133. /// <summary>
  134. /// Hit test.
  135. /// Return value: -1 - no hit
  136. /// 0 - hit anywhere
  137. /// > 1 - handle number
  138. /// </summary>
  139. /// <param name="pointscroll"></param>
  140. /// <returns></returns>
  141. public override int HitTest(Point point)
  142. {
  143. if (Selected)
  144. {
  145. for (int i = 1; i <= HandleCount; i++)
  146. {
  147. if (GetHandleRectangle(i).Contains(point))
  148. return i;
  149. }
  150. }
  151. if (PointInObject(point))
  152. return 0;
  153. return -1;
  154. }
  155. protected override bool PointInObject(Point point)
  156. {
  157. return rectangle.Contains(point);
  158. }
  159. public override bool IntersectsWith(Rectangle rectangle)
  160. {
  161. return Rectangle.IntersectsWith(rectangle);
  162. }
  163. public override Cursor GetHandleCursor(int handleNumber)
  164. {
  165. return Cursors.Default;
  166. }
  167. public override void MoveHandleTo(Point point, int handleNumber)
  168. {
  169. startPoint = point;
  170. }
  171. public override void Move(int deltaX, int deltaY)
  172. {
  173. int x = ISurfaceBox.UnscaleScalar(deltaX);
  174. int y = ISurfaceBox.UnscaleScalar(deltaY);
  175. startPoint.X += x;
  176. startPoint.Y += y;
  177. rectangle.X += x;
  178. rectangle.Y += y;
  179. }
  180. public override RectangleF GetBoundingBox()
  181. {
  182. return rectangle;
  183. }
  184. public override List<PointF> GetPoints()
  185. {
  186. List<PointF> points = new List<PointF>();
  187. points.Add(startPoint);
  188. return points;
  189. }
  190. public override ParentStyleModel GetStyle()
  191. {
  192. return labelNumberMarkStyleModel;
  193. }
  194. public override string GetContent()
  195. {
  196. return nowNum.ToString();
  197. }
  198. }
  199. }