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设置控件和窗体的显 ...
随机推荐
- chroot_local_user和chroot_list_enable含义
很多情况下,我们希望限制ftp用户只能在其主目录下(root dir)下活动,不允许他们跳出主目录之外浏览服务器上 的其他目录,这时候我就需要使用到chroot_local_user,chroot_l ...
- Python实现Hadoop MapReduce程序
1.概述 Hadoop Streaming提供了一个便于进行MapReduce编程的工具包,使用它可以基于一些可执行命令.脚本语言或其他编程语言来实现Mapper和 Reducer,从而充分利用Had ...
- Redis的同步(主从复制)和Redis Sentinel
Redis的同步可以让其他服务器拥有一个不断更新的数据副本,从而使拥有数据副本的服务器可以处理客户端发出的读请求. 1.Redis同步的方法: 我们可以通过发送SLAVEOF host port命令来 ...
- Android API Level在11前后及16之后时Notification的不同用法
作为刚入门Android的小白,最近在按照郭大神的<第一行代码>在练习,在用到Notification时遇到了一些问题,网上资料比较零散,我这里做了一个总结分析给各位,若有错误,恳请指正~ ...
- 【转】SQL Server查询字段说明
select c .name, isnull(ETP .value, '') as Des FROM syscolumns c inner join systypes t on c. xusertyp ...
- Java 获取 文件md5校验码
讯雷下载的核心思想是校验文件的md5值,两个文件若md5相同则为同一文件. 当得到用户下载某个文件的请求后它根据数据库中保留的文件md5比对出拥有此文件的url, 将用户请求挂接到此url上并仿造一个 ...
- js访问 xmldom
加载XML文档: var xmlDom = new ActiveXObject("MSXML2.DOMDocument"); xmlDom.load("file ...
- matlab差分算法
今天实现了<一类求解方程全部根的改进差分进化算法>(by 宁桂英,周永权),虽然最后的实现结果并没有文中分析的那么好,但是本文依然是给了一个求解多项式全部实根的基本思路.思路是对的,利用了 ...
- C++_nullptr
C++_nullptr null 0 nullptr 的区别
- javascript限制input只允许输入数字
在做数据提交的表单时,经常要对input输入内容的类型进行限制,譬如javascript限制input只允许输入数字,最好的方法当然是使用javascript,因为它不用与服务器交互,大大减轻了服务器 ...