C# 实现磁性窗体
- using System;
- using System.Drawing;
- using System.Collections.Generic;
- using System.Windows.Forms;
- namespace TinyBook
- {
- public enum MagneticLocation
- {
- Left = 0,
- Right = 1,
- Top = 2,
- Bottom = 3
- }
- public enum MagneticState
- {
- Adsorbent, // 吸附
- Separation // 分离
- }
- public class MagneticManager
- {
- public class ChildFormInfo
- {
- public Form Child { get; set; }
- public MagneticLocation Location { get; set; }
- public MagneticState State { get; set; }
- public bool CutstomSetLocation { get; set; }
- }
- public int Step { get; set; }
- private Form m_mainForm = null;
- private List<ChildFormInfo> m_childs= new List<ChildFormInfo>();
- public MagneticManager(Form form)
- {
- m_mainForm = form;
- form.LocationChanged += MainForm_LocationChanged;
- form.SizeChanged += MainForm_SizeChanged;
- form.FormClosed += MainForm_FormClosed;
- Step = 20;
- }
- public void addChild(Form childForm, MagneticLocation loc)
- {
- foreach (ChildFormInfo info in m_childs)
- {
- if (info.Child == childForm)
- {
- return;
- }
- }
- ChildFormInfo childInfo = new ChildFormInfo();
- childInfo.Child = childForm;
- childInfo.Location = loc;
- childInfo.State = MagneticState.Adsorbent;
- childInfo.CutstomSetLocation = false;
- childForm.LocationChanged += ChildForm_LocationChanged;
- childForm.SizeChanged += ChildForm_SizeChanged;
- childForm.FormClosed += ChildForm_FormClosed;
- m_childs.Add(childInfo);
- adsorbentChild(childInfo);
- }
- private ChildFormInfo getInfo(Form form)
- {
- if (form == null)
- {
- return null;
- }
- foreach (ChildFormInfo info in m_childs)
- {
- if (info.Child == form)
- {
- return info;
- }
- }
- return null;
- }
- private Point getLocation(ChildFormInfo info)
- {
- Point pos = Point.Empty;
- switch (info.Location)
- {
- case MagneticLocation.Left:
- pos = new Point(m_mainForm.Left - info.Child.Width + 14, m_mainForm.Top);
- break;
- case MagneticLocation.Right:
- pos = new Point(m_mainForm.Right - 14, m_mainForm.Top);
- break;
- case MagneticLocation.Top:
- pos = new Point(m_mainForm.Left, m_mainForm.Top - info.Child.Height);
- break;
- case MagneticLocation.Bottom:
- pos = new Point(m_mainForm.Left, m_mainForm.Bottom);
- break;
- default:
- break;
- }
- return pos;
- }
- private void setChildLocation(ChildFormInfo info, Point location)
- {
- if (info.Child == null)
- {
- return;
- }
- info.CutstomSetLocation = true;
- info.Child.Location = location;
- info.CutstomSetLocation = false;
- }
- private void setChildLocation(ChildFormInfo info, int x, int y)
- {
- setChildLocation(info, new Point(x, y));
- }
- private void resetChildLocation(ChildFormInfo info)
- {
- if (info.Child == null)
- {
- return;
- }
- Point pos = getLocation(info);
- setChildLocation(info, pos);
- }
- private void adsorbentChild(ChildFormInfo info)
- {
- info.State = MagneticState.Adsorbent;
- resetChildLocation(info);
- }
- private void separationChild(ChildFormInfo info)
- {
- info.State = MagneticState.Separation;
- }
- private void MainForm_LocationChanged(object sender, EventArgs e)
- {
- foreach (ChildFormInfo info in m_childs)
- {
- if (info.State == MagneticState.Adsorbent)
- {
- resetChildLocation(info);
- }
- }
- }
- private void MainForm_SizeChanged(object sender, EventArgs e)
- {
- foreach (ChildFormInfo info in m_childs)
- {
- if (info.State == MagneticState.Adsorbent)
- {
- resetChildLocation(info);
- }
- }
- }
- private void MainForm_FormClosed(object sender, EventArgs e)
- {
- }
- private void ChildForm_LocationChanged(object sender, EventArgs e)
- {
- ChildFormInfo info = getInfo(sender as Form);
- if (info == null)
- {
- return;
- }
- if (info.CutstomSetLocation == true)
- {
- return;
- }
- Point location = getLocation(info);
- if (info.Child.Left > location.X && info.Location == MagneticLocation.Right)
- {
- if (info.Child.Left - location.X > Step)
- {
- separationChild(info);
- }
- else
- {
- adsorbentChild(info);
- }
- }
- else if (info.Child.Left < location.X && info.Location == MagneticLocation.Left)
- {
- if (info.Child.Left - location.X < -Step)
- {
- separationChild(info);
- }
- else
- {
- adsorbentChild(info);
- }
- }
- if (info.Child.Top > location.Y && info.Location == MagneticLocation.Bottom)
- {
- if (info.Child.Top - location.Y > Step)
- {
- separationChild(info);
- }
- else
- {
- adsorbentChild(info);
- }
- }
- else if (info.Child.Top < location.Y && info.Location == MagneticLocation.Top)
- {
- if (info.Child.Top - location.Y < -Step)
- {
- separationChild(info);
- }
- else
- {
- adsorbentChild(info);
- }
- }
- }
- private void ChildForm_SizeChanged(object sender, EventArgs e)
- {
- ChildFormInfo info = getInfo(sender as Form);
- if (info != null && info.State == MagneticState.Adsorbent)
- {
- resetChildLocation(info);
- }
- }
- private void ChildForm_FormClosed(object sender, EventArgs e)
- {
- ChildFormInfo info = getInfo(sender as Form);
- if (info != null)
- {
- m_childs.Remove(info);
- }
- }
- }
- }
版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。
C# 实现磁性窗体的更多相关文章
- 磁性窗体设计C#(二)
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- C#磁性窗体设计
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- c#轻松实现磁性窗口
/// <summary>/// 磁性窗体函数/// </summary>/// <param name="form">窗体控件(一般传this ...
- MP3文件ID3信息编辑器代码开源 - 开源研究系列文章
上次把磁性窗体的源码开源了,这次就开源另一个程序源码:MP3文件ID3信息编辑器.这个源码也比较简单,关键在于获取和写入MP3文件的这个ID3的信息即可. 这个操作信息编辑的就封装在MP3ID3.ba ...
- 198个经典C#WinForm实例源码(超赞) 里面的例子 .sln 目录
\-窗体技巧\QQ窗体\QQFrm.sln; \-窗体技巧\仿XP系统的任务栏菜单\仿XP系统的任务栏菜单.sln; \-窗体技巧\向窗体中拖放图片并显示\向窗体中拖放图片并显示.sln; \-窗体技 ...
- 《Visual Basic开发实战1200例》包括第I卷、第II卷共计1200个例子,本书是第I卷,共计600个例子。
本书以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Visual Basic进行程序开发各个方面的知识和技巧.主要包括基础知识.窗体界面设计.控件应用等.全书分6篇20章,共计6 ...
- JavaScript动画-磁性吸附
▓▓▓▓▓▓ 大致介绍 磁性吸附是以模拟拖拽为基础添加一个拖拽时范围的限定而来的一个效果,如果对模拟拖拽有疑问的同学请移步模拟拖拽. 源代码.效果:点这里 ▓▓▓▓▓▓ 范围限定(可视区) 先来看一个 ...
- javascript动画系列第二篇——磁性吸附
× 目录 [1]范围限定 [2]拖拽范围 [3]磁性吸附 前面的话 上一篇,我们介绍了元素拖拽的实现.但在实际应用中,常常需要为拖拽的元素限定范围.而通过限定范围,再增加一些辅助的措施,就可以实现磁性 ...
- VB.NET设置控件和窗体的显示级别
前言:在用VB.NET开发射频检测系统ADS时,当激活已存在的目标MDI子窗体时,被其他子窗体遮住了,导致目标MDI子窗体不能显示. 这个问题怎么解决呢?网上看到一篇帖子VB.NET设置控件和窗体的显 ...
随机推荐
- git使用三把斧
git status -查看哪些更改 git add file1 file2 ...
- Struts2 请求参数接收
在Struts2中提供了更为简单的参数请求与接收方法,可以直接在Action中定义属性:Struts2通过反射机制将参数反射到属性的set方法上实现参数的传递: GET方式传送参数 <strut ...
- Ignatius and the Princess II(全排列)
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- UVA LA 7146 2014上海亚洲赛(贪心)
option=com_onlinejudge&Itemid=8&page=show_problem&category=648&problem=5158&mosm ...
- grep -v grep 代表在查询的最终结果中去掉grep命令本身
grep -v grep 代表在查询的最终结果中去掉grep命令本身
- AngularJs(三) deployd 服务的使用
使用服务建立数据 在AngularJS(二)中,我搭建好了deployd服务,现在启动服务,创建正在的数据(开始是使用模拟数据),使用cmd命令 一.开启Mongodb数据. 贴图: 二:测试是否正常 ...
- oracle form 触发器执行顺序及键定义[Z]
1当打开FORM时: (1)PRE-FORM (2)PRE-BLOCK(BLOCK级) (3)WHEN-NEW-FORM-INSTANCE (4)WHEN-NEW-BLOCK-INSTANCE (5) ...
- 为何遍历Ldr会得到空项?
转自:http://www.0xaa55.com/thread-1385-1-1.html 之前做过ldr遍历的操作,发现第一项竟然是空,也就是大部分元素都是0,下面来揭示一下原理: 经过研究,其实L ...
- EC读书笔记系列之3:条款5、条款6、条款7
条款5:了解C++默默编写并调用哪些函数 记住: ★编译器可以(仅仅是可以,并非必须,仅当程序中有这样的用法时才会这么做!!!)暗自为class创建default构造函数,copy构造函数,copy ...
- php分页类及其实现原理
/** * * 实现思路:分页显示拆分 : 1...上页 12 13 14 15 [16] 17 18 19 20 ...100 下页 * * function htmlPart1() : 上页 * ...