ToolMeasureTraceCurve.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using PaintDotNet.Annotation.Enum;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. namespace PaintDotNet.Annotation.Measure
  5. {
  6. /// <summary>
  7. /// 测量->曲线->轨迹曲线
  8. /// </summary>
  9. public class ToolMeasureTraceCurve : ToolMeasureObject
  10. {
  11. private static int lastX;
  12. private static int lastY;
  13. private static MeasureTraceCurve newTraceCurve;
  14. private const int minDistance = 15 * 15;
  15. private static bool moved = false;
  16. /// <summary>
  17. /// Left nouse button is pressed
  18. /// </summary>
  19. /// <param name="drawArea"></param>
  20. /// <param name="e"></param>
  21. public static void OnMouseDown(ISurfaceBox drawArea, MouseEventArgs e)
  22. {
  23. if (e.Button == MouseButtons.Left && e.Clicks != 2)
  24. {
  25. Point p = GetEventPointInArea(drawArea, e.Location);
  26. newTraceCurve = new MeasureTraceCurve(drawArea, p.X, p.Y, p.X + 1, p.Y + 1);
  27. newTraceCurve.ISurfaceBox = drawArea;
  28. AddNewObject(drawArea, newTraceCurve);
  29. lastX = p.X;
  30. lastY = p.Y;
  31. }
  32. else
  33. {
  34. newTraceCurve = null;
  35. if (!drawArea.ContinuousDrawingMeasure())
  36. {
  37. drawArea.ActiveTool = DrawToolType.Pointer;
  38. }
  39. OnMouseNotLeftDown(drawArea, newTraceCurve);
  40. }
  41. }
  42. /// <summary>
  43. /// Mouse move - resize new polygon
  44. /// </summary>
  45. /// <param name="drawArea"></param>
  46. /// <param name="e"></param>
  47. public static void OnMouseMove(ISurfaceBox drawArea, MouseEventArgs e)
  48. {
  49. Point p = GetEventPointInArea(drawArea, e.Location);
  50. if (e.Button != MouseButtons.Left)
  51. return;
  52. if (newTraceCurve == null)
  53. return; // precaution
  54. if (newTraceCurve != null)
  55. newTraceCurve.moved = true;
  56. moved = true;
  57. Point point = new Point(p.X, p.Y);
  58. int distance = (p.X - lastX) * (p.X - lastX) + (p.Y - lastY) * (p.Y - lastY);
  59. if (distance < minDistance)
  60. {
  61. // Distance between last two points is less than minimum -
  62. // move last pointscroll
  63. newTraceCurve.MoveHandleTo(point, newTraceCurve.HandleCount);
  64. drawArea.GraphicsList.Dirty = true;
  65. }
  66. else
  67. {
  68. // Add new pointscroll
  69. newTraceCurve.AddPoint(point);
  70. lastX = p.X;
  71. lastY = p.Y;
  72. drawArea.GraphicsList.Dirty = true;
  73. }
  74. drawArea.Refresh();
  75. }
  76. /// <summary>
  77. /// 鼠标抬起事件
  78. /// </summary>
  79. /// <param name="drawArea"></param>
  80. /// <param name="e"></param>
  81. public static void OnMouseUp(ISurfaceBox drawArea, MouseEventArgs e)
  82. {
  83. if (e.Button == MouseButtons.Left)
  84. {
  85. if (!moved)
  86. {
  87. if (newTraceCurve != null)
  88. {
  89. for (int i = 0; i < drawArea.GraphicsList.Count; i++)
  90. {
  91. if (drawArea.GraphicsList[i].drawToolType == newTraceCurve.drawToolType)
  92. {
  93. drawArea.GraphicsList.RemoveAt(i);
  94. break;
  95. }
  96. }
  97. }
  98. }
  99. moved = false;
  100. if (newTraceCurve != null)
  101. {
  102. newTraceCurve.pointChange = false;
  103. newTraceCurve.mouseUpPointChange = false;
  104. }
  105. if (!drawArea.ContinuousDrawingMeasure())
  106. drawArea.ActiveTool = DrawToolType.Pointer;
  107. OnMouseUpTwo(drawArea, e);
  108. }
  109. }
  110. public static void OnMouseClick(ISurfaceBox drawArea, MouseEventArgs e)
  111. {
  112. }
  113. /// <summary>
  114. /// 鼠标左键双击
  115. /// </summary>
  116. /// <param name="drawArea"></param>
  117. /// <param name="e"></param>
  118. public static void OnMouseLeftDoubleClick(ISurfaceBox surfacebox, MouseEventArgs e)
  119. {
  120. }
  121. /// <summary>
  122. /// 删除按键
  123. /// </summary>
  124. /// <param name="surfacebox"></param>
  125. /// <param name="e"></param>
  126. public static void OnDelKeyDown(ISurfaceBox surfacebox, MouseEventArgs e)
  127. {
  128. }
  129. /// <summary>
  130. /// 删除划痕处理&污迹处理选择区域的痕迹
  131. /// </summary>
  132. /// <param name="surfacebox"></param>
  133. /// <param name="e"></param>
  134. public static void OnDel2KeyDown(ISurfaceBox surfacebox, MouseEventArgs e)
  135. {
  136. }
  137. /// <summary>
  138. /// 清空全部时调用该方法,将可能未绘制完的对象清空
  139. /// </summary>
  140. public static void beginWithNewObject()
  141. {
  142. newTraceCurve = null;
  143. }
  144. }
  145. }