class ControlMover
{
#region
public enum Direction
{
Any,
Horizontal,
Vertical
}
public static void Init(Control control)
{
Init(control, Direction.Any);
}
public static void Init(Control control, Direction direction)
{
Init(control, control, direction);
}
/// <summary>
///
/// </summary>
/// <param name="control"></param>
/// <param name="container">基准的容器</param>
/// <param name="direction"></param>
public static void Init(Control control, Control container, Direction direction)
{
Control parentCtr = control.Parent;//父控件
bool Dragging = false;//拖动
Point DragStart = Point.Empty;//拖动起点坐标
control.MouseDown += delegate(object sender, MouseEventArgs e)
{
if (parentCtr != null)
{
foreach (Control item in parentCtr.Controls)
{
item.BackColor = Color.Empty;
}
}
Dragging = true;
DragStart = new Point(e.X, e.Y);
control.Capture = true;
control.BackColor = Color.Yellow;
control.BringToFront();
};
control.MouseUp += delegate(object sender, MouseEventArgs e)
{
Dragging = false;
control.Capture = false;
};
control.MouseMove += delegate(object sender, MouseEventArgs e)
{
if (Dragging)
{
control.Cursor = Cursors.SizeAll;
if (direction != Direction.Vertical)
{
int left = e.X + container.Left - DragStart.X;
//右边界处理
if (parentCtr != null)
{
if (left > parentCtr.Width - container.Width)
{
left = parentCtr.Width - container.Width;
}
}
container.Left = Math.Max(0, left);
}
if (direction != Direction.Horizontal)
{
int top = e.Y + container.Top - DragStart.Y;
//下边界处理
if (parentCtr != null)
{
if (top > parentCtr.Height - container.Height)
{
top = parentCtr.Height - container.Height;
}
}
container.Top = Math.Max(0, top);
}
}
};
}
#endregion
#region
//**********************************************
以下是网上找的
***************************//
const int Band = 5;
const int MinWidth = 10;
const int MinHeight = 10;
private static EnumMousePointPosition m_MousePointPosition;
private static Point p, p1;
private enum EnumMousePointPosition
{
MouseSizeNone = 0, //'无
MouseSizeRight = 1, //'拉伸右边框
MouseSizeLeft = 2, //'拉伸左边框
MouseSizeBottom = 3, //'拉伸下边框
MouseSizeTop = 4, //'拉伸上边框
MouseSizeTopLeft = 5, //'拉伸左上角
MouseSizeTopRight = 6, //'拉伸右上角
MouseSizeBottomLeft = 7, //'拉伸左下角
MouseSizeBottomRight = 8, //'拉伸右下角
MouseDrag = 9 // '鼠标拖动
}
private static EnumMousePointPosition MousePointPosition(Size size, System.Windows.Forms.MouseEventArgs e)
{
if ((e.X >= -1 * Band) | (e.X <= size.Width) | (e.Y >= -1 * Band) | (e.Y <= size.Height))
{
if (e.X < Band)
{
if (e.Y < Band) { return EnumMousePointPosition.MouseSizeTopLeft; }
else
{
if (e.Y > -1 * Band + size.Height)
{ return EnumMousePointPosition.MouseSizeBottomLeft; }
else
{ return EnumMousePointPosition.MouseSizeLeft; }
}
}
else
{
if (e.X > -1 * Band + size.Width)
{
if (e.Y < Band)
{ return EnumMousePointPosition.MouseSizeTopRight; }
else
{
if (e.Y > -1 * Band + size.Height)
{ return EnumMousePointPosition.MouseSizeBottomRight; }
else
{ return EnumMousePointPosition.MouseSizeRight; }
}
}
else
{
if (e.Y < Band)
{ return EnumMousePointPosition.MouseSizeTop; }
else
{
if (e.Y > -1 * Band + size.Height)
{ return EnumMousePointPosition.MouseSizeBottom; }
else
{ return EnumMousePointPosition.MouseDrag; }
}
}
}
}
else
{ return EnumMousePointPosition.MouseSizeNone; }
}
public static void Init2(Control control)
{
control.MouseDown += delegate(object sender, MouseEventArgs e)
{
p.X = e.X;
p.Y = e.Y;
p1.X = e.X;
p1.Y = e.Y;
};
control.MouseMove += delegate(object sender, MouseEventArgs e)
{
Control lCtrl = (sender as Control);
if (e.Button == MouseButtons.Left)
{
switch (m_MousePointPosition)
{
case EnumMousePointPosition.MouseDrag:
lCtrl.Left = lCtrl.Left + e.X - p.X;
lCtrl.Top = lCtrl.Top + e.Y - p.Y;
break;
case EnumMousePointPosition.MouseSizeBottom:
lCtrl.Height = lCtrl.Height + e.Y - p1.Y;
p1.X = e.X;
p1.Y = e.Y; //'记录光标拖动的当前点
break;
case EnumMousePointPosition.MouseSizeBottomRight:
lCtrl.Width = lCtrl.Width + e.X - p1.X;
lCtrl.Height = lCtrl.Height + e.Y - p1.Y;
p1.X = e.X;
p1.Y = e.Y; //'记录光标拖动的当前点
break;
case EnumMousePointPosition.MouseSizeRight:
lCtrl.Width = lCtrl.Width + e.X - p1.X;
// lCtrl.Height = lCtrl.Height + e.Y - p1.Y;
p1.X = e.X;
p1.Y = e.Y; //'记录光标拖动的当前点
break;
case EnumMousePointPosition.MouseSizeTop:
lCtrl.Top = lCtrl.Top + (e.Y - p.Y);
lCtrl.Height = lCtrl.Height - (e.Y - p.Y);
break;
case EnumMousePointPosition.MouseSizeLeft:
lCtrl.Left = lCtrl.Left + e.X - p.X;
lCtrl.Width = lCtrl.Width - (e.X - p.X);
break;
case EnumMousePointPosition.MouseSizeBottomLeft:
lCtrl.Left = lCtrl.Left + e.X - p.X;
lCtrl.Width = lCtrl.Width - (e.X - p.X);
lCtrl.Height = lCtrl.Height + e.Y - p1.Y;
p1.X = e.X;
p1.Y = e.Y; //'记录光标拖动的当前点
break;
case EnumMousePointPosition.MouseSizeTopRight:
lCtrl.Top = lCtrl.Top + (e.Y - p.Y);
lCtrl.Width = lCtrl.Width + (e.X - p1.X);
lCtrl.Height = lCtrl.Height - (e.Y - p.Y);
p1.X = e.X;
p1.Y = e.Y; //'记录光标拖动的当前点
break;
case EnumMousePointPosition.MouseSizeTopLeft:
lCtrl.Left = lCtrl.Left + e.X - p.X;
lCtrl.Top = lCtrl.Top + (e.Y - p.Y);
lCtrl.Width = lCtrl.Width - (e.X - p.X);
lCtrl.Height = lCtrl.Height - (e.Y - p.Y);
break;
default:
break;
}
if (lCtrl.Width < MinWidth) lCtrl.Width = MinWidth;
if (lCtrl.Height < MinHeight) lCtrl.Height = MinHeight;
}
else
{
m_MousePointPosition = MousePointPosition(lCtrl.Size, e); //'判断光标的位置状态
switch (m_MousePointPosition) //'改变光标
{
case EnumMousePointPosition.MouseSizeNone:
control.Cursor = Cursors.Arrow; //'箭头
break;
case EnumMousePointPosition.MouseDrag:
control.Cursor = Cursors.SizeAll; //'四方向
break;
case EnumMousePointPosition.MouseSizeBottom:
control.Cursor = Cursors.SizeNS; //'南北
break;
case EnumMousePointPosition.MouseSizeTop:
control.Cursor = Cursors.SizeNS; //'南北
break;
case EnumMousePointPosition.MouseSizeLeft:
control.Cursor = Cursors.SizeWE; //'东西
break;
case EnumMousePointPosition.MouseSizeRight:
control.Cursor = Cursors.SizeWE; //'东西
break;
case EnumMousePointPosition.MouseSizeBottomLeft:
control.Cursor = Cursors.SizeNESW; //'东北到南西
break;
case EnumMousePointPosition.MouseSizeBottomRight:
control.Cursor = Cursors.SizeNWSE; //'东南到西北
break;
case EnumMousePointPosition.MouseSizeTopLeft:
control.Cursor = Cursors.SizeNWSE; //'东南到西北
break;
case EnumMousePointPosition.MouseSizeTopRight:
control.Cursor = Cursors.SizeNESW; //'东北到南西
break;
default:
break;
}
}
};
control.Leave += delegate(object sender, EventArgs e)
{
m_MousePointPosition = EnumMousePointPosition.MouseSizeNone;
control.Cursor = Cursors.Arrow;
};
}
//****************************************************************************//
private static void SetCursor(Control ctr, EnumMousePointPosition mousePosition)
{
switch (mousePosition) //'改变光标
{
case EnumMousePointPosition.MouseSizeNone:
ctr.Cursor = Cursors.Arrow; //'箭头
break;
case EnumMousePointPosition.MouseDrag:
ctr.Cursor = Cursors.SizeAll; //'四方向
break;
case EnumMousePointPosition.MouseSizeBottom:
ctr.Cursor = Cursors.SizeNS; //'南北
break;
case EnumMousePointPosition.MouseSizeTop:
ctr.Cursor = Cursors.SizeNS; //'南北
break;
case EnumMousePointPosition.MouseSizeLeft:
ctr.Cursor = Cursors.SizeWE; //'东西
break;
case EnumMousePointPosition.MouseSizeRight:
ctr.Cursor = Cursors.SizeWE; //'东西
break;
case EnumMousePointPosition.MouseSizeBottomLeft:
ctr.Cursor = Cursors.SizeNESW; //'东北到南西
break;
case EnumMousePointPosition.MouseSizeBottomRight:
ctr.Cursor = Cursors.SizeNWSE; //'东南到西北
break;
case EnumMousePointPosition.MouseSizeTopLeft:
ctr.Cursor = Cursors.SizeNWSE; //'东南到西北
break;
case EnumMousePointPosition.MouseSizeTopRight:
ctr.Cursor = Cursors.SizeNESW; //'东北到南西
break;
default:
ctr.Cursor = Cursors.Arrow;
break;
}
}
private static void SetDrag(Control ctr, MouseEventArgs e, Point dragStart)
{
switch (m_MousePointPosition)
{
case EnumMousePointPosition.MouseDrag:
break;
case EnumMousePointPosition.MouseSizeBottom:
break;
case EnumMousePointPosition.MouseSizeBottomRight:
break;
case EnumMousePointPosition.MouseSizeRight:
ctr.Width = e.X + ctr.Width;
break;
case EnumMousePointPosition.MouseSizeTop:
break;
case EnumMousePointPosition.MouseSizeLeft:
break;
case EnumMousePointPosition.MouseSizeBottomLeft:
break;
case EnumMousePointPosition.MouseSizeTopRight:
break;
case EnumMousePointPosition.MouseSizeTopLeft:
break;
default:
break;
}
}
//****************************************************************************//
#endregion
}