可以实现窗体的 吸附 移动 分离

 
 
  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. }

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

C# 实现磁性窗体的更多相关文章

  1. 磁性窗体设计C#(二)

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  2. C#磁性窗体设计

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  3. c#轻松实现磁性窗口

    /// <summary>/// 磁性窗体函数/// </summary>/// <param name="form">窗体控件(一般传this ...

  4. MP3文件ID3信息编辑器代码开源 - 开源研究系列文章

    上次把磁性窗体的源码开源了,这次就开源另一个程序源码:MP3文件ID3信息编辑器.这个源码也比较简单,关键在于获取和写入MP3文件的这个ID3的信息即可. 这个操作信息编辑的就封装在MP3ID3.ba ...

  5. 198个经典C#WinForm实例源码(超赞) 里面的例子 .sln 目录

    \-窗体技巧\QQ窗体\QQFrm.sln; \-窗体技巧\仿XP系统的任务栏菜单\仿XP系统的任务栏菜单.sln; \-窗体技巧\向窗体中拖放图片并显示\向窗体中拖放图片并显示.sln; \-窗体技 ...

  6. 《Visual Basic开发实战1200例》包括第I卷、第II卷共计1200个例子,本书是第I卷,共计600个例子。

    本书以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Visual Basic进行程序开发各个方面的知识和技巧.主要包括基础知识.窗体界面设计.控件应用等.全书分6篇20章,共计6 ...

  7. JavaScript动画-磁性吸附

    ▓▓▓▓▓▓ 大致介绍 磁性吸附是以模拟拖拽为基础添加一个拖拽时范围的限定而来的一个效果,如果对模拟拖拽有疑问的同学请移步模拟拖拽. 源代码.效果:点这里 ▓▓▓▓▓▓ 范围限定(可视区) 先来看一个 ...

  8. javascript动画系列第二篇——磁性吸附

    × 目录 [1]范围限定 [2]拖拽范围 [3]磁性吸附 前面的话 上一篇,我们介绍了元素拖拽的实现.但在实际应用中,常常需要为拖拽的元素限定范围.而通过限定范围,再增加一些辅助的措施,就可以实现磁性 ...

  9. VB.NET设置控件和窗体的显示级别

    前言:在用VB.NET开发射频检测系统ADS时,当激活已存在的目标MDI子窗体时,被其他子窗体遮住了,导致目标MDI子窗体不能显示. 这个问题怎么解决呢?网上看到一篇帖子VB.NET设置控件和窗体的显 ...

随机推荐

  1. HTML5全屏API

    现在大多数浏览器都有全屏功能,允许用户来设置或操作.但HTML5的全屏API与之不同,HTML5的全屏API允许web开发工程师在程序中调用. 这样,web开发工程师就可以再网站中设计一个按钮,当该按 ...

  2. Struts2 对Action中所有方法进行输入校验、单个方法进行校验

    index.jsp: <body> <s:fielderror /> <form action="${pageContext.request.contextPa ...

  3. D. DZY Loves Modification

    D. DZY Loves Modification time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  4. 9款极具创意的HTML5/CSS3进度条动画(免积分下载)

    尊重原创,原文地址:http://www.cnblogs.com/html5tricks/p/3622918.html 免积分打包下载地址:http://download.csdn.net/detai ...

  5. windows 环境怎样恢复 (oracle 11g grid) ocr voting 损坏的集群

     windows 环境怎样恢复 (oracle 11g grid) ocr voting 损坏的集群 oracle 11g 以后 ocr 能够放到 asm 磁盘上,而ASM的启动依赖于ocr和vo ...

  6. bootstrapvalidator之API学习

    最近项目用到了bootstrap框架,其中前端用的校验,采用的是bootstrapvalidator插件,也是非常强大的一款插件.我这里用的是0.5.2版本.下面记录一下使用中学习到的相关API,不定 ...

  7. utf8+bom格式保存php curl乱码问题

    今天开发遇到一个php curl取数据乱码问题 不是gzip也不是编码设置问题 最后有一同事判断为utf8+bom保存数据原因,懒得深入了解utf8+bom,仅做记录 [root@centos5 ~] ...

  8. 20151225--easyUI

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  9. Devpexpress 打印预览问题

    devexpress 12 之前报表打印: XtraReports rp1 = new XtraReports(); rp1.ShowPreview(): 即可预览报表: devexpress 13 ...

  10. QF——对不同尺寸屏幕的适配(自动布局:AutoLayout)

    对不同尺寸设备UI的适配: 很多时候,我们的App可能运行在不同尺寸的设备上,或者横竖屏时,呈现方法应该也不一样.这样便要求UI里各控件的位置和大小不能写死. 对于不同尺寸UI的适配,一般有三种对策: ...