C# 在运行中拖拽,改变控件大小位置类(转载)
原文地址:https://blog.csdn.net/zgke/article/details/3718989
copy的code
/// <summary>
/// 移动改变控件大小
/// zgke@sina.com
///qq: 116149
/// </summary>
public class ControlMove
{
#region 移动命令
private enum MoveCommand
{
None,
Move,
SizeLeft,
SizeRight,
SizeUp,
SizeDown,
SizeLeftUp,
SizeLeftDown,
SizeRightUp,
SizeRightDown
}
/// <summary>
/// 当前命令
/// </summary>
private MoveCommand m_MoveCommand = MoveCommand.None;
#endregion
private Control m_ParentControl;
private Control m_MoveControl;
private Point m_MousePoint = Point.Empty;
private Point m_MouseRight = Point.Empty;
private int m_SamillSizeTop = ;
private int m_SamillSizeLeft = ; public ControlMove(Control p_MoveControl)
{
if (p_MoveControl.Parent == null) return;
m_ParentControl = p_MoveControl.Parent;
m_MoveControl = p_MoveControl;
p_MoveControl.MouseDown += new MouseEventHandler(p_MoveControl_MouseDown);
p_MoveControl.MouseLeave += new EventHandler(p_MoveControl_MouseLeave);
p_MoveControl.MouseMove += new MouseEventHandler(p_MoveControl_MouseMove);
p_MoveControl.MouseUp += new MouseEventHandler(p_MoveControl_MouseUp);
System.Reflection.PropertyInfo _BorderStyleInfo = p_MoveControl.GetType().GetProperty("BorderStyle");
if (_BorderStyleInfo == null) return;
try
{
if ((BorderStyle)_BorderStyleInfo.GetValue(p_MoveControl, new object[] { }) == BorderStyle.Fixed3D) m_SamillSizeLeft = ;
}
catch
{
}
} void p_MoveControl_MouseUp(object sender, MouseEventArgs e)
{
m_MoveCommand = MoveCommand.None;
m_MoveControl.Cursor = Cursors.Hand;
if (MoveEnd != null) MoveEnd(m_MoveControl);
} void p_MoveControl_MouseMove(object sender, MouseEventArgs e)
{
if (m_MoveCommand == MoveCommand.None)
{
GetCursor(new Point(e.X, e.Y));
return;
}
switch (m_MoveCommand)
{
case MoveCommand.Move:
int _PointX = m_MousePoint.X - e.X;
int _PointY = m_MousePoint.Y - e.Y;
if (m_Min)
{
if (m_MoveControl.Location.X - _PointX <= ) _PointX = ;
if (m_MoveControl.Location.Y - _PointY <= ) _PointY = ;
}
if (m_Max)
{
if (m_MoveControl.Location.X - _PointX + m_MoveControl.Width >= m_ParentControl.Width) _PointX = ;
if (m_MoveControl.Location.Y - _PointY + m_MoveControl.Height >= m_ParentControl.Height) _PointY = ;
}
m_MoveControl.Location = new Point(m_MoveControl.Location.X - _PointX, m_MoveControl.Location.Y - _PointY);
break;
#region 上下左右
case MoveCommand.SizeRight:
if ((m_MoveControl.Width + e.X - m_MousePoint.X) < ) break;
if (m_Max)
{
int _Max = (m_MoveControl.Width + e.X - m_MousePoint.X) + m_MoveControl.Location.X;
if (_Max >= m_ParentControl.Width) break;
}
m_MoveControl.Width = m_MoveControl.Width + e.X - m_MousePoint.X;
m_MousePoint.X = e.X;
m_MousePoint.Y = e.Y;
break;
case MoveCommand.SizeDown:
if ((m_MoveControl.Height + e.Y - m_MousePoint.Y) < ) break;
if (m_Max)
{
int _Max = (m_MoveControl.Height + e.Y - m_MousePoint.Y) + m_MoveControl.Location.Y;
if (_Max >= m_ParentControl.Height) break;
}
m_MoveControl.Height = m_MoveControl.Height + e.Y - m_MousePoint.Y;
m_MousePoint.X = e.X;
m_MousePoint.Y = e.Y;
break;
case MoveCommand.SizeUp:
if ((m_MoveControl.Height - (e.Y - m_MousePoint.Y)) < ) break;
if (m_Min)
{
int _Mix = m_MoveControl.Top + (e.Y - m_MousePoint.Y);
if (_Mix < ) break;
}
m_MoveControl.Top = m_MoveControl.Top + (e.Y - m_MousePoint.Y);
m_MoveControl.Height = m_MoveControl.Height - (e.Y - m_MousePoint.Y);
break;
case MoveCommand.SizeLeft:
if ((m_MoveControl.Width - (e.X - m_MousePoint.X)) < ) break;
if (m_Min)
{
int _Mix = m_MoveControl.Left + e.X - m_MousePoint.X;
if (_Mix < ) break;
}
m_MoveControl.Left = m_MoveControl.Left + e.X - m_MousePoint.X;
m_MoveControl.Width = m_MoveControl.Width - (e.X - m_MousePoint.X);
break;
#endregion #region 四角
case MoveCommand.SizeLeftUp:
int _Left = m_MoveControl.Left + e.X - m_MousePoint.X;
int _Top = m_MoveControl.Top + (e.Y - m_MousePoint.Y);
int _Width = m_MoveControl.Width - (e.X - m_MousePoint.X);
int _Height = m_MoveControl.Height - (e.Y - m_MousePoint.Y);
if (_Width < ) //这里如果错误 换成直接返回break
{
_Width = ;
_Left = m_MoveControl.Left;
}
if (_Height < )
{
_Height = ;
_Top = m_MoveControl.Top;
}
if (m_Min)
{
if (_Left < )
{
_Left = ;
_Width = m_MoveControl.Width;
}
if (_Top < )
{
_Top = ;
_Height = m_MoveControl.Height;
}
}
m_MoveControl.Left = _Left;
m_MoveControl.Top = _Top;
m_MoveControl.Width = _Width;
m_MoveControl.Height = _Height;
break;
case MoveCommand.SizeRightDown:
if ((m_MoveControl.Width + e.X - m_MousePoint.X) < ) break;
if ((m_MoveControl.Height + e.Y - m_MousePoint.Y) < ) break;
if (m_Max)
{
int _Max = (m_MoveControl.Height + e.Y - m_MousePoint.Y) + m_MoveControl.Location.Y;
if (_Max >= m_ParentControl.Height) break;
_Max = (m_MoveControl.Width + e.X - m_MousePoint.X) + m_MoveControl.Location.X;
if (_Max >= m_ParentControl.Width) break;
}
m_MoveControl.Width = m_MoveControl.Width + e.X - m_MousePoint.X;
m_MoveControl.Height = m_MoveControl.Height + e.Y - m_MousePoint.Y;
m_MousePoint.X = e.X;
m_MousePoint.Y = e.Y; //'记录光标拖动的当前点
break;
case MoveCommand.SizeRightUp:
if ((m_MoveControl.Width + (e.X - m_MousePoint.X)) < ) break;
if ((m_MoveControl.Height - (e.Y - m_MouseRight.Y)) < ) break;
if (m_Min)
{
if ((m_MoveControl.Top + (e.Y - m_MouseRight.Y)) < ) break;
}
m_MoveControl.Top = m_MoveControl.Top + (e.Y - m_MouseRight.Y);
m_MoveControl.Width = m_MoveControl.Width + (e.X - m_MousePoint.X);
m_MoveControl.Height = m_MoveControl.Height - (e.Y - m_MouseRight.Y);
m_MousePoint.X = e.X;
m_MousePoint.Y = e.Y; //'记录光标拖动的当前点
break;
case MoveCommand.SizeLeftDown:
if ((m_MoveControl.Width - (e.X - m_MouseRight.X)) < ) break;
if ((m_MoveControl.Height + e.Y - m_MousePoint.Y) < ) break;
if (m_Min)
{
if ((m_MoveControl.Left + e.X - m_MouseRight.X) < ) break;
}
if (m_Max)
{
int _Max = (m_MoveControl.Height + e.Y - m_MousePoint.Y) + m_MoveControl.Location.Y;
if (_Max >= m_ParentControl.Height) break;
}
m_MoveControl.Left = m_MoveControl.Left + e.X - m_MouseRight.X;
m_MoveControl.Width = m_MoveControl.Width - (e.X - m_MouseRight.X);
m_MoveControl.Height = m_MoveControl.Height + e.Y - m_MousePoint.Y;
m_MousePoint.X = e.X;
m_MousePoint.Y = e.Y; //'记录光标拖动的当前点
break;
#endregion
}
} void p_MoveControl_MouseLeave(object sender, EventArgs e)
{
m_MoveControl.Cursor = Cursors.Default;
} void p_MoveControl_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
m_MoveCommand = GetCommand(new Point(e.X, e.Y));
m_MousePoint = new Point(e.X, e.Y);
m_MouseRight = new Point(e.X, e.Y);
switch (m_MoveCommand)
{
case MoveCommand.Move:
m_MoveControl.Cursor = Cursors.SizeAll;
break;
default:
break;
}
}
} /// <summary>
/// 根据鼠标位置获取执行的命令
/// </summary>
/// <param name="p_MousePoint"></param>
private MoveCommand GetCommand(Point p_MousePoint)
{
#region 四角
if (p_MousePoint.X <= m_SamillSizeTop && p_MousePoint.Y <= m_SamillSizeTop) if (m_Size) return MoveCommand.SizeLeftUp;
if (p_MousePoint.X <= m_SamillSizeTop && p_MousePoint.Y >= m_MoveControl.Height - m_SamillSizeLeft) if (m_Size) return MoveCommand.SizeLeftDown;
if (p_MousePoint.X >= m_MoveControl.Width - m_SamillSizeLeft && p_MousePoint.Y <= m_SamillSizeTop) if (m_Size) return MoveCommand.SizeRightUp;
if (p_MousePoint.X >= m_MoveControl.Width - m_SamillSizeLeft && p_MousePoint.Y >= m_MoveControl.Height - m_SamillSizeLeft) if (m_Size) return MoveCommand.SizeRightDown;
#endregion
#region 上下左右
if (p_MousePoint.X <= m_SamillSizeTop) if (m_Size) return MoveCommand.SizeLeft;
if (p_MousePoint.Y <= m_SamillSizeTop) if (m_Size) return MoveCommand.SizeUp;
if (p_MousePoint.X >= m_MoveControl.Width - m_SamillSizeLeft) if (m_Size) return MoveCommand.SizeRight;
if (p_MousePoint.Y >= m_MoveControl.Height - m_SamillSizeLeft) if (m_Size) return MoveCommand.SizeDown;
#endregion
if (m_Move) return MoveCommand.Move;
return MoveCommand.None;
} /// <summary>
/// 设置鼠标样式
/// </summary>
/// <param name="p_MousePoint"></param>
private void GetCursor(Point p_MousePoint)
{
MoveCommand _Command = GetCommand(p_MousePoint);
switch (_Command)
{
#region 四角
case MoveCommand.Move:
m_MoveControl.Cursor = Cursors.Hand;
return;
case MoveCommand.SizeLeftUp:
m_MoveControl.Cursor = Cursors.SizeNWSE;
return;
case MoveCommand.SizeLeftDown:
m_MoveControl.Cursor = Cursors.SizeNESW;
return;
case MoveCommand.SizeRightUp:
m_MoveControl.Cursor = Cursors.SizeNESW;
return;
case MoveCommand.SizeRightDown:
m_MoveControl.Cursor = Cursors.SizeNWSE;
return;
#endregion
#region 上下左右
case MoveCommand.SizeLeft:
m_MoveControl.Cursor = Cursors.SizeWE;
return;
case MoveCommand.SizeUp:
m_MoveControl.Cursor = Cursors.SizeNS;
return;
case MoveCommand.SizeRight:
m_MoveControl.Cursor = Cursors.SizeWE;
return;
case MoveCommand.SizeDown:
m_MoveControl.Cursor = Cursors.SizeNS;
return;
#endregion
}
} #region 属性
private bool m_Move = true;
/// <summary>
/// 是否能移动控见
/// </summary>
public bool Move { get { return m_Move; } set { m_Move = value; } }
private bool m_Min = true;
/// <summary>
/// 是否移动到最小区域
/// </summary>
public bool Min { get { return m_Min; } set { m_Min = value; } }
private bool m_Max = true;
/// <summary>
/// 是否移动到最大区域
/// </summary>
public bool Max { get { return m_Max; } set { m_Max = value; } }
private bool m_Size = true;
/// <summary>
/// 是否能设置大小
/// </summary>
public bool Size { get { return m_Size; } set { m_Size = value; } }
#endregion public delegate void ControlMoveEnd(Control sender);
public event ControlMoveEnd MoveEnd;
}
C# 在运行中拖拽,改变控件大小位置类(转载)的更多相关文章
- C++ MFC 改变控件大小和位置
用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置. void MoveWindow(int x,int y,int nWidth,int nHeight ...
- c# asp.net 鼠标改变控件坐标位置,更改控件坐标,注册表保存读取,打印,查找局域网内打印机等等收集
界面虽然被我弄的很难看,但功能还可以 里边注册表的路径自己设置一下,或者加一个创建注册表的语句,不然会报错 前台: <%@ Page Language="C#" AutoEv ...
- WPF中动态改变控件显示位置
转自 http://blog.csdn.net/lassewang/article/details/6928897 测试环境: Windows XP/Windows 7 开发环境: Microsoft ...
- Android之动态改变控件大小
利用getLayoutParams()方法和setLayoutParams()方法.三步曲:1.首先利用getLayoutParams()方法,获取控件的LayoutParams.eg:LayoutP ...
- pyqt5 动画学习(一) 改变控件大小
入坑pyqt也有半年了,由于人们对事物的审美,静态界面已经不能满足用户,而动画却给人眼前一亮,so,今天来学习pyqt的动画了 由于资料真的是太少,本人也是有啃外国佬的英文进行摸索学习,可能也是触及皮 ...
- C#移动及改变控件大小
//代码比较简单,就不多解析了. #region 移动窗体保存数据 Point mouseOff;//鼠标移动位置变量 bool leftFlag; //标志是否为左键 bool largeFlag; ...
- java实现控件的移动及使用鼠标改变控件大小
package cn.com.test; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; ...
- C:\\MFC控件大小随窗体大小而改变
一.大小和位置都改变 1.首先为窗体类添加CRect m_rect,该成员变量用来记录窗体的当前大小. 2.在类向导里面(Ctrl+W),为窗体添加消息WM_SIZE的响应函数OnSize(): 注意 ...
- BCGcontrolBar(五) 对话框大小改变控件自动适应
改变控件大小 首先在 构造函数中加入 EnableLayout(); 在OnInitDialog()函数中加入 CBCGPStaticLayout* pLayout = (CBCGPStaticLay ...
随机推荐
- UML部署图介绍
https://www.w3cschool.cn/uml_tutorial/uml_tutorial-mi5w28ur.html
- grub下如何指定哪个分区为根文件系统?
答: 使用root命令,如: grub> set root=(hd0,msdos1)
- SQL-W3School-函数:SQL ROUND() 函数
ylbtech-SQL-W3School-函数:SQL ROUND() 函数 1.返回顶部 1. ROUND() 函数 ROUND 函数用于把数值字段舍入为指定的小数位数. SQL ROUND() 语 ...
- jsp中用java代码拼接下拉选备选项及默认值【我】
<th id="TD_N_CERTIFICATION_TYPE" >证件类型:</th> <td > <select id="C ...
- 运维之利器--Ansible
一.简介 Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署. ...
- windows下配置Sublime Text 2开发Nodejs
1 下载 Sublime Text 2 http://www.sublimetext.com/ 2 下载Nodejs插件,下载ZIP包 https://github.com/tanepiper/Sub ...
- 《Fluid Engine Development》 学习笔记3-光滑粒子流体动力学
用粒子表示流体最热门的方法就是就是光滑粒子流体动力学(Smoothed Particle Hydrodynamics (SPH).) 这种方法模糊了流体的边界,用有限数量的粒子代表流体,该方法的基本思 ...
- Ubuntu18.04命令行安装mysql未提示输入密码,修改mysql默认密码
Ubuntu18.04命令行安装mysql未提示输入密码,修改mysql默认密码 mysql默认密码为空 但是使用mysql -uroot -p 命令连接mysql时,报错ERROR 1045 (28 ...
- C语言程序设计II—第十周教学
第十周教学总结(29/4-5/5) 教学内容 本周的教学内容为:9.2 学生成绩排序 知识点:结构数组的定义.初始化和数组成员引用:9.3 修改学生成绩 知识点:结构指针指向操作,结构指针作为函数参数 ...
- element-ui image放大 v2.x版本 点击无反应
1.官网文档:由于官网上没有写对应组件的版本信息,默认是最新版本.所以在老版本里,可能还没有这个功能. 2.github源码日志:提交时间是2019.07.25,确认后发现老版本的确没有此功能. 3. ...