使用方式
- private Zgke.WindowFrom.Window.Controls.ControlMove _Move;
- private void Form1_Load(object sender, EventArgs e)
- {
- _Move = new Zgke.WindowFrom.Window.Controls.ControlMove(dataGridView1);
- _Move.Size = true; //是否能改变控件大小
- _Move.Move = true; //是否能移动控件
- _Move.Max = true; //是否能移动大于窗体的位置
- _Move.Min = true; //是否能移动到窗体的最前面
- _Move.MoveEnd += new Zgke.WindowFrom.Window.Controls.ControlMove.ControlMoveEnd(_Move_MoveEnd);
- }
- void _Move_MoveEnd(Control sender)
- {
- this.Text = sender.Location.ToString() + sender.Size.ToString();
- }
全部类
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Windows.Forms;
- using System.Drawing;
- namespace Zgke.WindowFrom.Window.Controls
- {
- /// <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 = 3;
- private int m_SamillSizeLeft = 5;
- 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 = 8;
- }
- 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 <= 0) _PointX = 0;
- if (m_MoveControl.Location.Y - _PointY <= 0) _PointY = 0;
- }
- if (m_Max)
- {
- if (m_MoveControl.Location.X - _PointX + m_MoveControl.Width >= m_ParentControl.Width) _PointX = 0;
- if (m_MoveControl.Location.Y - _PointY + m_MoveControl.Height >= m_ParentControl.Height) _PointY = 0;
- }
- 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) < 10) 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) < 10) 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)) < 10) break;
- if (m_Min)
- {
- int _Mix = m_MoveControl.Top + (e.Y - m_MousePoint.Y);
- if (_Mix < 0) 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)) < 10) break;
- if (m_Min)
- {
- int _Mix = m_MoveControl.Left + e.X - m_MousePoint.X;
- if (_Mix < 0) 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 < 10) //这里如果错误 换成直接返回break
- {
- _Width = 10;
- _Left = m_MoveControl.Left;
- }
- if (_Height < 10)
- {
- _Height = 10;
- _Top = m_MoveControl.Top;
- }
- if (m_Min)
- {
- if (_Left < 0)
- {
- _Left = 0;
- _Width = m_MoveControl.Width;
- }
- if (_Top < 0)
- {
- _Top = 0;
- _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) < 10) break;
- if ((m_MoveControl.Height + e.Y - m_MousePoint.Y) < 10) 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)) < 10) break;
- if ((m_MoveControl.Height - (e.Y - m_MouseRight.Y)) < 10) break;
- if (m_Min)
- {
- if ((m_MoveControl.Top + (e.Y - m_MouseRight.Y)) < 0) 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)) < 10) break;
- if ((m_MoveControl.Height + e.Y - m_MousePoint.Y) < 10) break;
- if (m_Min)
- {
- if ((m_MoveControl.Left + e.X - m_MouseRight.X) < 0) 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;
- }
- }