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设置控件和窗体的显 ...
随机推荐
- javascript数组去重算法-----3
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 配置自己风格的Clang-Format-Xcode
在项目根目录下,创建一个文件.clang-format,使用vim打开并修改. 具体的配置风格可以看这里:http://clang.llvm.org/docs/ClangFormatStyleOpti ...
- linux下的进程、网络、性能监控命令
进程监控 端口 1)netstat -anp | grep xxx 2)lsof -i:<port> 句柄 lsof -n | grep xxxx 线程栈 1)gst ...
- .net通用权限框架B/S(二) 数据库设计
1.组织机构---员工是1:n关系 2.角色---员工n:n 3.角色--导航菜单n:n 4.操作权限(id)---导航菜单(prms_id)n:n [此处是n:n关系正常是生成第三张表存放多对多 ...
- ORA-32001: 已请求写入 SPFILE, 但是在启动时未指定 SPFILE
SQL> alter system set smtp_out_server='smtp.126.com' scope=both;alter system set smtp_out_server= ...
- 通过自定义注解反射生成SQL语句
----------------------------------------Program.cs---------------------------------------- using Sys ...
- Programming C#.Classes and Objects.成员方法
this关键字指向类的当前实例,this指针是类中所有非静态方法的隐藏指针,每个方法都能通过this指针指向对象的其他方法和成员变量. 因为对一个类来说,它的成员函数(方法)只有一份,所有的实例对象共 ...
- mysql集群安装配置
看网上很多人说mysql集群不是很稳定,因此这2天做了下mysql的集群,打算配置没有什么问题了,过2天做下相关的性能测试,我的配置环境如下: 操作系统: Centos5.2 软件 ...
- jquery学习(2)--选择器
jquery-李炎恢学习视频学习笔记.自己手写. 简单的选择器 css 写 法: #box{ color:#f00;} //id选择器 jquery获取:$('#box').css( ...
- xampp环境安装swoole
手动编译php运行环境经常遇到函数库依赖的问题,这个错误搞定了,又蹦出来那个错误,很棘手,为了快速搭建一个swoole开发环境,于是另辟蹊径,直接下载安装xampp for linux,然后在用xam ...