using System.Drawing; using System.Windows.Forms; namespace OTSIncAReportApp { /// /// 拖拽帮助类,控件需要注册该类中的鼠标相关事件 /// public class DragHelper { #region 变量定义 /// /// 光标状态 /// private enum EnumMousePointPosition { StateLess, //无状态 LeftBorderStetch, //左边框拉伸 TopLeftCornerStretch, //左上角拉伸 TopBorderStretch, //上边框拉伸 TopRightCornerStretch, //右上角拉伸 RightBorderStretch, //右边框拉伸 BottomRightCornerStretch, //右下角拉伸 BottomBorderStretch, //下边框拉伸 BottomLeftCornerStretch, //左下角拉伸 Drag //拖曳 } /// /// 控件原背景色 /// private static Color oldColor = default(Color); /// /// 控件点击时使用的背景色 /// private static Color controlFocusedBackcolor = Color.Red; /// /// 鼠标拖拽使用的原始点 /// private static Point mouseDragOldPoint = default(Point); /// /// 鼠标上一次改变大小后的位置点 /// private static Point mouseSizeLastPoint = default(Point); /// /// 绘制边框的画笔 /// private static Pen borderPen = new Pen(Color.Black); /// /// 光标变化临界的宽度 /// private const int BAND = 3; /// /// 控件最小宽度 /// private const int MINWIDTH = 10; /// /// 控件最小高度 /// private const int MINHEIGHT = 10; /// /// 当前鼠标操作 /// private static EnumMousePointPosition mousePointPosition = EnumMousePointPosition.StateLess; #endregion #region 鼠标相关方法 /// /// 注册控件拖拽事件 /// /// 拖拽区域控件 public static void RegisterDragEvent(Control ctl) { ctl.MouseDown += DragHelper.DragControl_MouseDown; ctl.MouseUp += DragHelper.DragControl_MouseUp; ctl.MouseMove += DragHelper.DragControl_MouseMove; } /// /// 控件鼠标点击事件 /// /// /// private static void DragControl_MouseDown(object sender, MouseEventArgs e) { Control currentControl = null; mouseDragOldPoint = mouseSizeLastPoint = e.Location; //保存控件当前位置 currentControl = sender as Control; oldColor = currentControl.BackColor; //保存背景色,鼠标弹起时恢复 currentControl.BackColor = controlFocusedBackcolor; //改变背景色 } /// /// 鼠标在控件上移动事件 /// /// /// private static void DragControl_MouseMove(object sender, MouseEventArgs e) { Control currentControl = null; currentControl = sender as Control; if (e.Button != MouseButtons.Left) { mousePointPosition = GetMousePointPosition(currentControl.Size, e); switch (mousePointPosition) { case EnumMousePointPosition.LeftBorderStetch: case EnumMousePointPosition.RightBorderStretch: Cursor.Current = Cursors.SizeWE; break; case EnumMousePointPosition.TopBorderStretch: case EnumMousePointPosition.BottomBorderStretch: Cursor.Current = Cursors.SizeNS; break; case EnumMousePointPosition.TopLeftCornerStretch: case EnumMousePointPosition.BottomRightCornerStretch: Cursor.Current = Cursors.SizeNWSE; break; case EnumMousePointPosition.TopRightCornerStretch: case EnumMousePointPosition.BottomLeftCornerStretch: Cursor.Current = Cursors.SizeNESW; break; case EnumMousePointPosition.Drag: Cursor.Current = Cursors.SizeAll; break; default: Cursor.Current = null; break; } return; } switch (mousePointPosition) { case EnumMousePointPosition.Drag: currentControl.Left += e.X - mouseDragOldPoint.X; currentControl.Top += e.Y - mouseDragOldPoint.Y; break; case EnumMousePointPosition.BottomBorderStretch: currentControl.Height += e.Y - mouseSizeLastPoint.Y; mouseSizeLastPoint = e.Location; //记录光标拖动的当前点 break; case EnumMousePointPosition.BottomRightCornerStretch: currentControl.Width += e.X - mouseSizeLastPoint.X; currentControl.Height = e.Y - mouseSizeLastPoint.Y; mouseSizeLastPoint = e.Location; //记录光标拖动的当前点 break; case EnumMousePointPosition.RightBorderStretch: currentControl.Width += e.X - mouseSizeLastPoint.X; mouseSizeLastPoint = e.Location; //记录光标拖动的当前点 break; case EnumMousePointPosition.TopBorderStretch: currentControl.Top += e.Y - mouseDragOldPoint.Y; currentControl.Height -= e.Y - mouseDragOldPoint.Y; break; case EnumMousePointPosition.LeftBorderStetch: currentControl.Left += e.X - mouseDragOldPoint.X; currentControl.Width -= e.X - mouseDragOldPoint.X; break; case EnumMousePointPosition.BottomLeftCornerStretch: currentControl.Left += e.X - mouseDragOldPoint.X; currentControl.Width -= e.X - mouseDragOldPoint.X; currentControl.Height += e.Y - mouseSizeLastPoint.Y; mouseSizeLastPoint = e.Location; //记录光标拖动的当前点 break; case EnumMousePointPosition.TopRightCornerStretch: currentControl.Top += e.Y - mouseDragOldPoint.Y; currentControl.Width += e.X - mouseSizeLastPoint.X; currentControl.Height -= e.Y - mouseDragOldPoint.Y; mouseSizeLastPoint = e.Location; //记录光标拖动的当前点 break; case EnumMousePointPosition.TopLeftCornerStretch: currentControl.Left += e.X - mouseDragOldPoint.X; currentControl.Top += e.Y - mouseDragOldPoint.Y; currentControl.Width -= e.X - mouseDragOldPoint.X; currentControl.Height -= e.Y - mouseDragOldPoint.Y; break; default: break; } if (currentControl.Width < MINWIDTH) { currentControl.Width = MINWIDTH; } if (currentControl.Height < MINHEIGHT) { currentControl.Height = MINHEIGHT; } } /// /// 控件鼠标弹起事件 /// /// /// private static void DragControl_MouseUp(object sender, MouseEventArgs e) { Control currentControl = null; currentControl = sender as Control; Cursor.Current = null; mousePointPosition = EnumMousePointPosition.StateLess; currentControl.BackColor = oldColor; //恢复控件背景色 } /// /// 获取鼠标位置 /// /// 控件大小 /// 鼠标位置 /// 鼠标光标位置 private static EnumMousePointPosition GetMousePointPosition(Size size, MouseEventArgs e) { if ((e.X < (-1 * BAND)) || (e.X > size.Width) || (e.Y < (-1 * BAND)) || (e.Y > size.Height))//光标越界 { return EnumMousePointPosition.StateLess; } if (e.X < BAND) { if (e.Y < BAND) { return EnumMousePointPosition.TopLeftCornerStretch; } else { if (e.Y > ((-1 * BAND) + size.Height)) { return EnumMousePointPosition.BottomLeftCornerStretch; } else { return EnumMousePointPosition.LeftBorderStetch; } } } else { if (e.X > (-1 * BAND + size.Width)) { if (e.Y < BAND) { return EnumMousePointPosition.TopRightCornerStretch; } else { if (e.Y > (-1 * BAND + size.Height)) { return EnumMousePointPosition.BottomRightCornerStretch; } else { return EnumMousePointPosition.RightBorderStretch; } } } else { if (e.Y < BAND) { return EnumMousePointPosition.TopBorderStretch; } else { if (e.Y > (-1 * BAND + size.Height)) { return EnumMousePointPosition.BottomBorderStretch; } else { return EnumMousePointPosition.Drag; } } } } } #endregion #region 绘制相关 /// /// 绘制控件边框 /// /// /// private static void DragControlParent_Paint(object sender, PaintEventArgs e) { Control currentControl = null; currentControl = sender as Control; return; } #endregion } }