C# 实现磁性窗体

时间:2021-11-23 20:57:14
可以实现窗体的 吸附 移动 分离
 
 
  1. using System;
  2. using System.Drawing;
  3. using System.Collections.Generic;
  4. using System.Windows.Forms;
  5. namespace TinyBook
  6. {
  7. public enum MagneticLocation
  8. {
  9. Left = 0,
  10. Right = 1,
  11. Top = 2,
  12. Bottom = 3
  13. }
  14. public enum MagneticState
  15. {
  16. Adsorbent, // 吸附
  17. Separation // 分离
  18. }
  19. public class MagneticManager
  20. {
  21. public class ChildFormInfo
  22. {
  23. public Form Child { get; set; }
  24. public MagneticLocation Location { get; set; }
  25. public MagneticState State { get; set; }
  26. public bool CutstomSetLocation { get; set; }
  27. }
  28. public int Step { get; set; }
  29. private Form m_mainForm = null;
  30. private List<ChildFormInfo> m_childs= new List<ChildFormInfo>();
  31. public MagneticManager(Form form)
  32. {
  33. m_mainForm = form;
  34. form.LocationChanged += MainForm_LocationChanged;
  35. form.SizeChanged += MainForm_SizeChanged;
  36. form.FormClosed += MainForm_FormClosed;
  37. Step = 20;
  38. }
  39. public void addChild(Form childForm, MagneticLocation loc)
  40. {
  41. foreach (ChildFormInfo info in m_childs)
  42. {
  43. if (info.Child == childForm)
  44. {
  45. return;
  46. }
  47. }
  48. ChildFormInfo childInfo = new ChildFormInfo();
  49. childInfo.Child = childForm;
  50. childInfo.Location = loc;
  51. childInfo.State = MagneticState.Adsorbent;
  52. childInfo.CutstomSetLocation = false;
  53. childForm.LocationChanged += ChildForm_LocationChanged;
  54. childForm.SizeChanged += ChildForm_SizeChanged;
  55. childForm.FormClosed += ChildForm_FormClosed;
  56. m_childs.Add(childInfo);
  57. adsorbentChild(childInfo);
  58. }
  59. private ChildFormInfo getInfo(Form form)
  60. {
  61. if (form == null)
  62. {
  63. return null;
  64. }
  65. foreach (ChildFormInfo info in m_childs)
  66. {
  67. if (info.Child == form)
  68. {
  69. return info;
  70. }
  71. }
  72. return null;
  73. }
  74. private Point getLocation(ChildFormInfo info)
  75. {
  76. Point pos = Point.Empty;
  77. switch (info.Location)
  78. {
  79. case MagneticLocation.Left:
  80. pos = new Point(m_mainForm.Left - info.Child.Width + 14, m_mainForm.Top);
  81. break;
  82. case MagneticLocation.Right:
  83. pos = new Point(m_mainForm.Right - 14, m_mainForm.Top);
  84. break;
  85. case MagneticLocation.Top:
  86. pos = new Point(m_mainForm.Left, m_mainForm.Top - info.Child.Height);
  87. break;
  88. case MagneticLocation.Bottom:
  89. pos = new Point(m_mainForm.Left, m_mainForm.Bottom);
  90. break;
  91. default:
  92. break;
  93. }
  94. return pos;
  95. }
  96. private void setChildLocation(ChildFormInfo info, Point location)
  97. {
  98. if (info.Child == null)
  99. {
  100. return;
  101. }
  102. info.CutstomSetLocation = true;
  103. info.Child.Location = location;
  104. info.CutstomSetLocation = false;
  105. }
  106. private void setChildLocation(ChildFormInfo info, int x, int y)
  107. {
  108. setChildLocation(info, new Point(x, y));
  109. }
  110. private void resetChildLocation(ChildFormInfo info)
  111. {
  112. if (info.Child == null)
  113. {
  114. return;
  115. }
  116. Point pos = getLocation(info);
  117. setChildLocation(info, pos);
  118. }
  119. private void adsorbentChild(ChildFormInfo info)
  120. {
  121. info.State = MagneticState.Adsorbent;
  122. resetChildLocation(info);
  123. }
  124. private void separationChild(ChildFormInfo info)
  125. {
  126. info.State = MagneticState.Separation;
  127. }
  128. private void MainForm_LocationChanged(object sender, EventArgs e)
  129. {
  130. foreach (ChildFormInfo info in m_childs)
  131. {
  132. if (info.State == MagneticState.Adsorbent)
  133. {
  134. resetChildLocation(info);
  135. }
  136. }
  137. }
  138. private void MainForm_SizeChanged(object sender, EventArgs e)
  139. {
  140. foreach (ChildFormInfo info in m_childs)
  141. {
  142. if (info.State == MagneticState.Adsorbent)
  143. {
  144. resetChildLocation(info);
  145. }
  146. }
  147. }
  148. private void MainForm_FormClosed(object sender, EventArgs e)
  149. {
  150. }
  151. private void ChildForm_LocationChanged(object sender, EventArgs e)
  152. {
  153. ChildFormInfo info = getInfo(sender as Form);
  154. if (info == null)
  155. {
  156. return;
  157. }
  158. if (info.CutstomSetLocation == true)
  159. {
  160. return;
  161. }
  162. Point location = getLocation(info);
  163. if (info.Child.Left > location.X && info.Location == MagneticLocation.Right)
  164. {
  165. if (info.Child.Left - location.X > Step)
  166. {
  167. separationChild(info);
  168. }
  169. else
  170. {
  171. adsorbentChild(info);
  172. }
  173. }
  174. else if (info.Child.Left < location.X && info.Location == MagneticLocation.Left)
  175. {
  176. if (info.Child.Left - location.X < -Step)
  177. {
  178. separationChild(info);
  179. }
  180. else
  181. {
  182. adsorbentChild(info);
  183. }
  184. }
  185. if (info.Child.Top > location.Y && info.Location == MagneticLocation.Bottom)
  186. {
  187. if (info.Child.Top - location.Y > Step)
  188. {
  189. separationChild(info);
  190. }
  191. else
  192. {
  193. adsorbentChild(info);
  194. }
  195. }
  196. else if (info.Child.Top < location.Y && info.Location == MagneticLocation.Top)
  197. {
  198. if (info.Child.Top - location.Y < -Step)
  199. {
  200. separationChild(info);
  201. }
  202. else
  203. {
  204. adsorbentChild(info);
  205. }
  206. }
  207. }
  208. private void ChildForm_SizeChanged(object sender, EventArgs e)
  209. {
  210. ChildFormInfo info = getInfo(sender as Form);
  211. if (info != null && info.State == MagneticState.Adsorbent)
  212. {
  213. resetChildLocation(info);
  214. }
  215. }
  216. private void ChildForm_FormClosed(object sender, EventArgs e)
  217. {
  218. ChildFormInfo info = getInfo(sender as Form);
  219. if (info != null)
  220. {
  221. m_childs.Remove(info);
  222. }
  223. }
  224. }
  225. }

版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。