private void mcp_MouseMove(object sender, CaptureMouseMoveEventArgs e) { RectangleMouseCapturer mcp = (RectangleMouseCapturer)sender; int dx = mcp.CurrentPosition.X - mcp.StartPosition.X; int dy = mcp.CurrentPosition.Y - mcp.StartPosition.Y; System.Drawing.Size size = this.Transform.TransformSize(dx, dy); mcp.DescRectangle = mcp.UpdateRectangle(mcp.SourceRectangle, size.Width, size.Height); }
/// <summary> /// 锁定鼠标并进行矩形的拖拉操作 /// </summary> /// <remarks>在文档编辑或其他设计器中,经常会出现需要使用鼠标拖拽对象四周边缘上的8个控制点 /// 的方式来改变对象的位置和大小,本函数则专门用于支持该操作。 /// 本函数会锁定用户的所有的鼠标和键盘消息,并根据鼠标的移动来修改 /// 指定的矩形,直到用户松开鼠标或者回调函数取消本次操作 /// DragStyle 参数为拖拽点的编号,其有效范围为-1至7,其意义为 /// -1 正在拖拽矩形本身,此时移动鼠标将整体移动矩形 /// 0 拖拽矩形左上角的控制点,修改矩形的左上角位置,矩形的右下角位置不变,会导致矩形的位置和大小的改变 /// 1 拖拽矩形上边缘中间的控制点,修改矩形的上边缘位置,其他3个边缘的位置不变,会导致矩形的顶端位置和高度的改变 /// 2 拖拽矩形右上角的控制点,修改矩形的右上角位置,其左下角的位置不变,会导致矩形的顶端位置和宽度的改变 /// 3 拖拽矩形右边缘中间的控制点,修改矩形的右边缘的位置,其他边缘位置不变,会导致矩形的宽度的改变 /// 4 拖拽矩形右下角的控制点,修改矩形的右下角的位置,左上角的位置不变,会导致矩形的大小的改变 /// 5 拖拽矩形下边缘中间的控制点,修改矩形的下边缘位置,其他边缘不变,会导致矩形的高度的改变 /// 6 拖拽矩形左下角的控制点,修改矩形的左下角位置,其右上角位置不变,会导致矩形的左端位置和高度的改变 /// 7 拖拽矩形左边缘中间的控制点,修改矩形左边缘的位置,其他边缘不变,会导致矩形的左端位置和宽度的改变 /// 关于8个拖拽控制点请参见<link>ZYCommon.DocumentView.GetDragRects</link></remarks> /// <param name="SourceRect">原始矩形,坐标为视图区域中的坐标</param> /// <param name="DragStyle">拖拽控制点的编号</param> /// <param name="DrawFocusRect">拖拉时是否绘制可逆转矩形,若设为true 则会拖拽时会自动绘制当前矩形的可逆矩形边框</param> /// <param name="WidthHeightRate">拖动时边框的宽度和高度的比例,若小于等于0.1则不作该设置</param> /// <param name="ShowSizeInfo" >拖动时是否显示大小信息</param> /// <param name="CallBack">回调函数的委托</param> /// <returns>原始矩形进行拖拉操作后修改后的矩形,若用户未改变原始矩形的大小或取消操作则返回空矩形,坐标为视图区域中的坐标</returns> /// <seealso>ZYCommon.CaptureDragRectangleHandler</seealso> public System.Drawing.Rectangle CaptureDragRect(System.Drawing.Rectangle SourceRect, int DragStyle, bool DrawFocusRect, double WidthHeightRate, bool ShowSizeInfo, CaptureDragRectangleHandler CallBack) { RectangleMouseCapturer mcp = new RectangleMouseCapturer(this); mcp.SourceRectangle = SourceRect; mcp.CustomAction = true; mcp.DragStyle = DragStyle; mcp.Draw += new CaptureMouseMoveEventHandler(mcp_Draw); mcp.MouseMove += new CaptureMouseMoveEventHandler(mcp_MouseMove); if (mcp.CaptureMouseMove()) { bolCaptureMouse = false; return(mcp.DescRectangle); } bolCaptureMouse = false; return(System.Drawing.Rectangle.Empty); }