DrawRectangle.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. using System;
  2. using System.Windows.Forms;
  3. using System.Drawing;
  4. using System.Diagnostics;
  5. using System.Globalization;
  6. using System.Runtime.Serialization;
  7. namespace DrawTools
  8. {
  9. /// <summary>
  10. /// Rectangle graphic object
  11. /// </summary>
  12. class DrawRectangle : DrawTools.DrawObject
  13. {
  14. private Rectangle rectangle;
  15. private const string entryRectangle = "Rect";
  16. protected Rectangle Rectangle
  17. {
  18. get
  19. {
  20. return rectangle;
  21. }
  22. set
  23. {
  24. rectangle = value;
  25. }
  26. }
  27. public DrawRectangle() : this(0, 0, 1, 1)
  28. {
  29. }
  30. public DrawRectangle(int x, int y, int width, int height) : base()
  31. {
  32. rectangle.X = x;
  33. rectangle.Y = y;
  34. rectangle.Width = width;
  35. rectangle.Height = height;
  36. Initialize();
  37. }
  38. /// <summary>
  39. /// Clone this instance
  40. /// </summary>
  41. public override DrawObject Clone()
  42. {
  43. DrawRectangle drawRectangle = new DrawRectangle();
  44. drawRectangle.rectangle = this.rectangle;
  45. FillDrawObjectFields(drawRectangle);
  46. return drawRectangle;
  47. }
  48. /// <summary>
  49. /// Draw rectangle
  50. /// </summary>
  51. /// <param name="g"></param>
  52. public override void Draw(Graphics g)
  53. {
  54. Pen pen = new Pen(Color, PenWidth);
  55. g.DrawRectangle(pen, DrawRectangle.GetNormalizedRectangle(Rectangle));
  56. pen.Dispose();
  57. }
  58. protected void SetRectangle(int x, int y, int width, int height)
  59. {
  60. rectangle.X = x;
  61. rectangle.Y = y;
  62. rectangle.Width = width;
  63. rectangle.Height = height;
  64. }
  65. /// <summary>
  66. /// Get number of handles
  67. /// </summary>
  68. public override int HandleCount
  69. {
  70. get
  71. {
  72. return 8;
  73. }
  74. }
  75. /// <summary>
  76. /// Get handle point by 1-based number
  77. /// </summary>
  78. /// <param name="handleNumber"></param>
  79. /// <returns></returns>
  80. public override Point GetHandle(int handleNumber)
  81. {
  82. int x, y, xCenter, yCenter;
  83. xCenter = rectangle.X + rectangle.Width/2;
  84. yCenter = rectangle.Y + rectangle.Height/2;
  85. x = rectangle.X;
  86. y = rectangle.Y;
  87. switch ( handleNumber )
  88. {
  89. case 1:
  90. x = rectangle.X;
  91. y = rectangle.Y;
  92. break;
  93. case 2:
  94. x = xCenter;
  95. y = rectangle.Y;
  96. break;
  97. case 3:
  98. x = rectangle.Right;
  99. y = rectangle.Y;
  100. break;
  101. case 4:
  102. x = rectangle.Right;
  103. y = yCenter;
  104. break;
  105. case 5:
  106. x = rectangle.Right;
  107. y = rectangle.Bottom;
  108. break;
  109. case 6:
  110. x = xCenter;
  111. y = rectangle.Bottom;
  112. break;
  113. case 7:
  114. x = rectangle.X;
  115. y = rectangle.Bottom;
  116. break;
  117. case 8:
  118. x = rectangle.X;
  119. y = yCenter;
  120. break;
  121. }
  122. return new Point(x, y);
  123. }
  124. /// <summary>
  125. /// Hit test.
  126. /// Return value: -1 - no hit
  127. /// 0 - hit anywhere
  128. /// > 1 - handle number
  129. /// </summary>
  130. /// <param name="point"></param>
  131. /// <returns></returns>
  132. public override int HitTest(Point point)
  133. {
  134. if ( Selected )
  135. {
  136. for ( int i = 1; i <= HandleCount; i++ )
  137. {
  138. if ( GetHandleRectangle(i).Contains(point) )
  139. return i;
  140. }
  141. }
  142. if ( PointInObject(point) )
  143. return 0;
  144. return -1;
  145. }
  146. protected override bool PointInObject(Point point)
  147. {
  148. return rectangle.Contains(point);
  149. }
  150. /// <summary>
  151. /// Get cursor for the handle
  152. /// </summary>
  153. /// <param name="handleNumber"></param>
  154. /// <returns></returns>
  155. public override Cursor GetHandleCursor(int handleNumber)
  156. {
  157. switch ( handleNumber )
  158. {
  159. case 1:
  160. return Cursors.SizeNWSE;
  161. case 2:
  162. return Cursors.SizeNS;
  163. case 3:
  164. return Cursors.SizeNESW;
  165. case 4:
  166. return Cursors.SizeWE;
  167. case 5:
  168. return Cursors.SizeNWSE;
  169. case 6:
  170. return Cursors.SizeNS;
  171. case 7:
  172. return Cursors.SizeNESW;
  173. case 8:
  174. return Cursors.SizeWE;
  175. default:
  176. return Cursors.Default;
  177. }
  178. }
  179. /// <summary>
  180. /// Move handle to new point (resizing)
  181. /// </summary>
  182. /// <param name="point"></param>
  183. /// <param name="handleNumber"></param>
  184. public override void MoveHandleTo(Point point, int handleNumber)
  185. {
  186. int left = Rectangle.Left;
  187. int top = Rectangle.Top;
  188. int right = Rectangle.Right;
  189. int bottom = Rectangle.Bottom;
  190. switch ( handleNumber )
  191. {
  192. case 1:
  193. left = point.X;
  194. top = point.Y;
  195. break;
  196. case 2:
  197. top = point.Y;
  198. break;
  199. case 3:
  200. right = point.X;
  201. top = point.Y;
  202. break;
  203. case 4:
  204. right = point.X;
  205. break;
  206. case 5:
  207. right = point.X;
  208. bottom = point.Y;
  209. break;
  210. case 6:
  211. bottom = point.Y;
  212. break;
  213. case 7:
  214. left = point.X;
  215. bottom = point.Y;
  216. break;
  217. case 8:
  218. left = point.X;
  219. break;
  220. }
  221. SetRectangle(left, top, right - left, bottom - top);
  222. }
  223. public override bool IntersectsWith(Rectangle rectangle)
  224. {
  225. return Rectangle.IntersectsWith(rectangle);
  226. }
  227. /// <summary>
  228. /// Move object
  229. /// </summary>
  230. /// <param name="deltaX"></param>
  231. /// <param name="deltaY"></param>
  232. public override void Move(int deltaX, int deltaY)
  233. {
  234. rectangle.X += deltaX;
  235. rectangle.Y += deltaY;
  236. }
  237. public override void Dump()
  238. {
  239. base.Dump ();
  240. Trace.WriteLine("rectangle.X = " + rectangle.X.ToString(CultureInfo.InvariantCulture));
  241. Trace.WriteLine("rectangle.Y = " + rectangle.Y.ToString(CultureInfo.InvariantCulture));
  242. Trace.WriteLine("rectangle.Width = " + rectangle.Width.ToString(CultureInfo.InvariantCulture));
  243. Trace.WriteLine("rectangle.Height = " + rectangle.Height.ToString(CultureInfo.InvariantCulture));
  244. }
  245. /// <summary>
  246. /// Normalize rectangle
  247. /// </summary>
  248. public override void Normalize()
  249. {
  250. rectangle = DrawRectangle.GetNormalizedRectangle(rectangle);
  251. }
  252. /// <summary>
  253. /// Save objevt to serialization stream
  254. /// </summary>
  255. /// <param name="info"></param>
  256. /// <param name="orderNumber"></param>
  257. public override void SaveToStream(System.Runtime.Serialization.SerializationInfo info, int orderNumber)
  258. {
  259. info.AddValue(
  260. String.Format(CultureInfo.InvariantCulture,
  261. "{0}{1}",
  262. entryRectangle, orderNumber),
  263. rectangle);
  264. base.SaveToStream (info, orderNumber);
  265. }
  266. /// <summary>
  267. /// LOad object from serialization stream
  268. /// </summary>
  269. /// <param name="info"></param>
  270. /// <param name="orderNumber"></param>
  271. public override void LoadFromStream(SerializationInfo info, int orderNumber)
  272. {
  273. rectangle = (Rectangle)info.GetValue(
  274. String.Format(CultureInfo.InvariantCulture,
  275. "{0}{1}",
  276. entryRectangle, orderNumber),
  277. typeof(Rectangle));
  278. base.LoadFromStream (info, orderNumber);
  279. }
  280. #region Helper Functions
  281. public static Rectangle GetNormalizedRectangle(int x1, int y1, int x2, int y2)
  282. {
  283. if ( x2 < x1 )
  284. {
  285. int tmp = x2;
  286. x2 = x1;
  287. x1 = tmp;
  288. }
  289. if ( y2 < y1 )
  290. {
  291. int tmp = y2;
  292. y2 = y1;
  293. y1 = tmp;
  294. }
  295. return new Rectangle(x1, y1, x2 - x1, y2 - y1);
  296. }
  297. public static Rectangle GetNormalizedRectangle(Point p1, Point p2)
  298. {
  299. return GetNormalizedRectangle(p1.X, p1.Y, p2.X, p2.Y);
  300. }
  301. public static Rectangle GetNormalizedRectangle(Rectangle r)
  302. {
  303. return GetNormalizedRectangle(r.X, r.Y, r.X + r.Width, r.Y + r.Height);
  304. }
  305. #endregion
  306. }
  307. }