using System; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; namespace Dongke.WinForm.Controls.InvoiceLayout { [ToolboxItem(false)] internal partial class ItemFrame : UserControl { #region 枚举 /// /// 边框操作 /// private enum HitDownSquare { /// /// 无 /// HDS_NONE = 0, /// /// 上中 /// HDS_TOP = 1, /// /// 右中 /// HDS_RIGHT = 2, /// /// 下中 /// HDS_BOTTOM = 3, /// /// 左中 /// HDS_LEFT = 4, /// /// 左上 /// HDS_LEFTTOP = 5, /// /// 右上 /// HDS_RIGHTTOP = 6, /// /// 左下 /// HDS_LEFTBOTTOM = 7, /// /// 右下 /// HDS_RIGHTBOTTOM = 8, /// /// 移动 /// HDS_MOVE = 9, } #endregion 枚举 #region 常量 private const int SQUARE_WIDTH = 7; // 操作场所的宽 private const int SQUARE_WIDTH_HALF = 3; // 操作场所的半宽 #endregion 常量 #region 成员变量 /* 操作场所 handler(#) / side-#- * (0)---0---(4)---1---(1) * | | * 2 6 * | | * (6) (8) (7) * | | * 3 7 * | | * (2)---4---(5)---5---(3) */ private Rectangle[] _handlerRect; private Rectangle[] _handlerDrawRect; private Rectangle[] _sideRect; private Rectangle _sideDrawRect; private Rectangle _handlerRect8; private HitDownSquare _currHitPlace; private LayoutItem _item; // 选择状态的Item private ItemLock _lock = ItemLock.None; private int _startX; // 鼠标操作开始位置X private int _startY; // 鼠标操作开始位置Y private int _mouseMoveX; // 鼠标移动开始位置X private int _mouseMoveY; // 鼠标移动开始位置Y private bool _isMouseDown; // 是否鼠标按下 private bool _isMouseMoveInPaperArea; // 是否鼠标移动 private Rectangle[] _downRectangles; // Item原始范围 private Rectangle[] _moveRectangles; // Item随鼠标移动的范围 private bool[] _sideRatioFixeds; private ItemLock[] _itemLockTyps; private bool _isShiftDown = false; private bool _isCtrlDown = false; private bool _isRealFollow = false; #endregion 成员变量 #region 构造函数 /// /// 构造函数 /// /// 选择状态的Item public ItemFrame(LayoutItem item) { InitializeComponent(); TabStop = false; SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint , true); _handlerRect = new Rectangle[8]; _handlerDrawRect = new Rectangle[8]; _sideRect = new Rectangle[8]; _item = item; if (_item != null) { _lock = _item.ItemLockType; } CreateFrame(); LostFocus += new EventHandler(RectTracker_LostFocus); } #endregion 构造函数 #region 事件处理 /// /// 发生于控制项失去焦点。 /// /// 指定的对象 /// 提供的事件数据 private void RectTracker_LostFocus(object sender, EventArgs e) { if (_moveRectangles != null && _isMouseMoveInPaperArea) { if (!_isRealFollow) { int count = _moveRectangles.Length; for (int i = 0; i < count; i++) { DrawReversibleFrame(_itemLockTyps[i], _moveRectangles[i], null); } } _isMouseDown = false; _isMouseMoveInPaperArea = false; _moveRectangles = null; } } /// /// KeyDown 事件 /// /// 指定的对象 /// 提供的事件数据 private void RectTracker_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.ShiftKey && !_isShiftDown) { _isShiftDown = true; } else if (e.KeyCode == Keys.ControlKey && !_isCtrlDown) { _isCtrlDown = true; } else { return; } if (_isMouseMoveInPaperArea) { int count = _moveRectangles.Length; for (int i = 0; i < count; i++) { ResizeToRectangle(new Point(_mouseMoveX, _mouseMoveY), i); } } } /// /// KeyUp 事件 /// /// 指定的对象 /// 提供的事件数据 private void RectTracker_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.ShiftKey && _isShiftDown) { _isShiftDown = false; } else if (e.KeyCode == Keys.ControlKey && _isCtrlDown) { _isCtrlDown = false; } else { return; } if (_isMouseMoveInPaperArea) { int count = _moveRectangles.Length; for (int i = 0; i < count; i++) { ResizeToRectangle(new Point(_mouseMoveX, _mouseMoveY), i); } } } /// /// MouseDown 事件 /// /// 指定的对象 /// 提供的事件数据 private void RectTracker_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (Pointer(e.Location)) { if (_isRealFollow) { _startX = e.X + this.Left; _startY = e.Y + this.Top; _mouseMoveX = _startX; _mouseMoveY = _startY; } else { _startX = e.X; _startY = e.Y; _mouseMoveX = e.X; _mouseMoveY = e.Y; } int count = _item.Owner.SelectedItems.Count; _downRectangles = new Rectangle[count]; _moveRectangles = new Rectangle[count]; _sideRatioFixeds = new bool[count]; _itemLockTyps = new ItemLock[count]; for (int i = 0; i < count; i++) { LayoutItem item = _item.Owner.SelectedItems[i]; if (item == null) { continue; } _downRectangles[i] = item.ShapeBounds; _moveRectangles[i] = _downRectangles[i]; _sideRatioFixeds[i] = item.SideRatioFixed; _itemLockTyps[i] = item.ItemLockType; _isMouseDown = true; } } } } /// /// MouseMove 事件 /// /// 指定的对象 /// 提供的事件数据 private void RectTracker_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && _isMouseDown) { int mx = e.X; int my = e.Y; if (_isRealFollow) { mx = e.X + this.Left; my = e.Y + this.Top; } if (_mouseMoveX != mx || _mouseMoveY != my) { int count = _moveRectangles.Length; for (int i = 0; i < count; i++) { ResizeToRectangle(new Point(mx, my), i); } _isMouseMoveInPaperArea = true; _mouseMoveX = mx; _mouseMoveY = my; } } else { Pointer(e.Location); } } /// /// MouseUp 事件 /// /// 指定的对象 /// 提供的事件数据 private void RectTracker_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && _isMouseDown) { if (_isMouseMoveInPaperArea && !_isRealFollow) { _item.Owner.Capture = false; int count = _moveRectangles.Length; int paperAreaLeft = _item.Owner.PaperArea.Left; int paperAreaTop = _item.Owner.PaperArea.Top; for (int i = 0; i < count; i++) { DrawReversibleFrame(_itemLockTyps[i], _moveRectangles[i], null); DragHandler(i); } } _isMouseDown = false; _isMouseMoveInPaperArea = false; _moveRectangles = null; } } /// /// Paint 事件 /// /// 指定的对象 /// 提供的事件数据 private void RectTracker_Paint(object sender, PaintEventArgs e) { DrawFrame(e.Graphics); } #endregion 事件处理 #region 函数 /// /// 创建边框 /// /// /// public void CreateFrame() { // 边界设置 Rectangle bounds = _item.ShapeBounds; bounds.X -= SQUARE_WIDTH_HALF; bounds.Y -= SQUARE_WIDTH_HALF; bounds.Width += SQUARE_WIDTH; bounds.Height += SQUARE_WIDTH; Bounds = bounds; // 可是范围设置 Region = new Region(SetViewRectangle()); Refresh(); BringToFront(); } /// /// 调整范围 /// /// 鼠标所在坐标 /// 选择Item的索引 private void ResizeToRectangle(Point p, int index) { Rectangle rect = _moveRectangles[index]; if ((_isCtrlDown || _sideRatioFixeds[index]) && _isShiftDown) { # region int changedX = p.X - _startX; int changedY = p.Y - _startY; // Move if (_currHitPlace == HitDownSquare.HDS_MOVE) { int changedABCX = Math.Abs(changedX); int changedABCY = Math.Abs(changedY); if (changedABCX < changedABCY) { rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; } else { rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; } rect.Width = _downRectangles[index].Width; rect.Height = _downRectangles[index].Height; } else { int rectW = _downRectangles[index].Width; int rectH = _downRectangles[index].Height; int rectWM = 0 - rectW; int rectHM = 0 - rectH; double sizeRatio = 1.0 * _downRectangles[index].Height / _downRectangles[index].Width; switch (_currHitPlace) { // 左上 case HitDownSquare.HDS_LEFTTOP: # region // A if (changedX < 0 && changedY < 0) { if (changedX * sizeRatio > changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // ABC if (0 <= changedX && changedX <= rectW && changedY < 0) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // C if (rectW < changedX && changedY < 0) { int changedABCX = changedX - rectW; int changedABCY = Math.Abs(changedY); if (changedABCX * sizeRatio < changedABCY) { changedX = rectW + System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // BI if (0 <= changedX && changedX <= rectW && changedY == 0) { rect = _downRectangles[index]; break; } // ADF if (changedX < 0 && 0 <= changedY && changedY <= rectH) { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // DI if (changedX == 0 && 0 <= changedY && changedY <= rectH) { rect = _downRectangles[index]; break; } // I if (0 < changedX && changedX < rectW && 0 < changedY && changedY < rectH) { if (changedX + changedX > rectW) { changedX = rectW - changedX; } if (changedY + changedY > rectH) { changedY = rectH - changedY; } if (changedX * sizeRatio > changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // IE if (changedX == rectW && 0 <= changedY && changedY <= rectH) { rect = _downRectangles[index]; break; } // CEH if (rectW < changedX && 0 <= changedY && changedY <= rectH) { changedY = System.Convert.ToInt32( Math.Round((rectW - changedX) * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // IG if (0 <= changedX && changedX <= rectW && changedY == rectH) { rect = _downRectangles[index]; break; } // F if (changedX < 0 && rectH < changedY) { int changedABCX = Math.Abs(changedX); int changedABCY = changedY - rectH; if (changedABCX * sizeRatio < changedABCY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectH + System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // FGH if (0 <= changedX && changedX <= rectW && rectH < changedY) { changedX = System.Convert.ToInt32( Math.Round((rectH - changedY) / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // H if (rectW < changedX && rectH < changedY) { if (changedX * sizeRatio < changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } # endregion break; // 上中 case HitDownSquare.HDS_TOP: rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width; rect.Height = _downRectangles[index].Height - changedY - changedY; break; // 右上 case HitDownSquare.HDS_RIGHTTOP: # region // A if (changedX < rectWM && changedY < 0) { int changedABCX = rectWM - changedX; int changedABCY = Math.Abs(changedY); if (changedABCX * sizeRatio < changedABCY) { changedX = rectWM - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // ABC if (rectWM <= changedX && changedX <= 0 && changedY < 0) { changedX = rectWM + System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // C if (0 < changedX && changedY < 0) { int changedABCX = changedX; int changedABCY = Math.Abs(changedY); if (changedABCX * sizeRatio < changedABCY) { changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // BI if (rectWM <= changedX && changedX <= 0 && changedY == 0) { rect = _downRectangles[index]; break; } // ADF if (changedX < rectWM && 0 <= changedY && changedY <= rectH) { changedY = System.Convert.ToInt32( Math.Round((changedX - rectWM) * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // DI if (changedX == rectWM && 0 <= changedY && changedY <= rectH) { rect = _downRectangles[index]; break; } // I if (rectWM < changedX && changedX < 0 && 0 < changedY && changedY < rectH) { if (changedX + changedX < rectWM) { changedX = rectWM - changedX; } if (changedY + changedY > rectH) { changedY = rectH - changedY; } int changedABCX = Math.Abs(changedX); int changedABCY = changedY; if (changedABCX * sizeRatio > changedABCY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // IE if (changedX == 0 && 0 <= changedY && changedY <= rectH) { rect = _downRectangles[index]; break; } // CEH if (0 < changedX && 0 <= changedY && changedY <= rectH) { changedY = 0 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // IG if (rectWM <= changedX && changedX <= 0 && changedY == rectH) { rect = _downRectangles[index]; break; } // F if (changedX < rectWM && rectH < changedY) { int changedABCX = rectWM - changedX; int changedABCY = changedY - rectH; if (changedABCX * sizeRatio < changedABCY) { changedX = rectWM - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectH + System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // FGH if (rectWM <= changedX && changedX <= 0 && rectH < changedY) { changedX = System.Convert.ToInt32( Math.Round((changedY - rectH) / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } // H if (0 < changedX && rectH < changedY) { int changedABCX = changedX; int changedABCY = changedY - rectH; if (changedABCX * sizeRatio < changedABCY) { changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectH + System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; } # endregion break; // 左中 case HitDownSquare.HDS_LEFT: rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height; break; // 左下 case HitDownSquare.HDS_LEFTBOTTOM: # region // A if (changedX < 0 && changedY < rectHM) { int changedABCX = Math.Abs(changedX); int changedABCY = rectHM - changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectHM - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // ABC if (0 <= changedX && changedX <= rectW && changedY < rectHM) { changedX = 0 - System.Convert.ToInt32( Math.Round((rectHM - changedY) / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // C if (rectW < changedX && changedY < rectHM) { int changedABCX = changedX - rectW; int changedABCY = rectHM - changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = rectW + System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectHM - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // BI if (0 <= changedX && changedX <= rectW && changedY == 0) { rect = _downRectangles[index]; break; } // ADF if (changedX < 0 && rectHM <= changedY && changedY <= 0) { changedY = rectHM - System.Convert.ToInt32( Math.Round((changedX - rectW) * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // DI if (changedX == 0 && rectHM <= changedY && changedY <= 0) { rect = _downRectangles[index]; break; } // I if (0 < changedX && changedX < rectW && rectHM < changedY && changedY < 0) { if (changedX + changedX > rectW) { changedX = rectW - changedX; } if (changedY + changedY < rectHM) { changedY = rectHM - changedY; } int changedABCX = changedX; int changedABCY = Math.Abs(changedY); if (changedABCX * sizeRatio > changedABCY) { changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // IE if (changedX == rectW && rectHM <= changedY && changedY <= 0) { rect = _downRectangles[index]; break; } // CEH if (rectW < changedX && rectHM <= changedY && changedY <= 0) { changedY = rectHM - System.Convert.ToInt32( Math.Round((changedX - rectW) * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // IG if (0 <= changedX && changedX <= rectW && changedY == 0) { rect = _downRectangles[index]; break; } // F if (changedX < 0 && 0 < changedY) { int changedABCX = Math.Abs(changedX); int changedABCY = changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // FGH if (0 <= changedX && changedX <= rectW && 0 < changedY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // H if (rectW < changedX && 0 < changedY) { int changedABCX = changedX - rectW; int changedABCY = changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = rectW + System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } # endregion break; // 右中 case HitDownSquare.HDS_RIGHT: rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height; break; // 下中 case HitDownSquare.HDS_BOTTOM: rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width; rect.Height = _downRectangles[index].Height + changedY + changedY; break; // 右下 case HitDownSquare.HDS_RIGHTBOTTOM: # region // A if (changedX < rectWM && changedY < rectHM) { if (changedX * sizeRatio > changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // ABC if (rectWM <= changedX && changedX <= 0 && changedY < rectHM) { changedX = System.Convert.ToInt32( Math.Round((rectHM - changedY) / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // C if (0 < changedX && changedY < rectHM) { int changedABCX = changedX; int changedABCY = rectHM - changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectHM - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // BI if (rectWM <= changedX && changedX <= 0 && changedY == rectHM) { rect = _downRectangles[index]; break; } // ADF if (changedX < rectWM && rectHM <= changedY && changedY <= 0) { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // DI if (changedX == rectWM && rectHM <= changedY && changedY <= 0) { rect = _downRectangles[index]; break; } // I if (rectWM < changedX && changedX < 0 && rectHM < changedY && changedY < 0) { if (changedX + changedX < rectWM) { changedX = rectWM - changedX; } if (changedY + changedY < rectHM) { changedY = rectHM - changedY; } if (changedX * sizeRatio < changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // IE if (changedX == 0 && rectHM <= changedY && changedY <= 0) { rect = _downRectangles[index]; break; } // CEH if (0 < changedX && rectHM <= changedY && changedY <= 0) { changedY = rectHM - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // IG if (rectWM <= changedX && changedX <= 0 && changedY == 0) { rect = _downRectangles[index]; break; } // F if (changedX < rectWM && 0 < changedY) { int changedABCX = rectWM - changedX; int changedABCY = changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = rectWM - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // FGH if (rectWM <= changedX && changedX <= 0 && 0 < changedY) { changedX = rectWM - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } // H if (0 < changedX && 0 < changedY) { if (changedX * sizeRatio < changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; } # endregion break; default: break; } } # endregion } else if (_isCtrlDown || _sideRatioFixeds[index]) { # region int changedX = p.X - _startX; int changedY = p.Y - _startY; // Move if (_currHitPlace == HitDownSquare.HDS_MOVE) { rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width; rect.Height = _downRectangles[index].Height; } else { int rectW = _downRectangles[index].Width; int rectH = _downRectangles[index].Height; int rectW2 = rectW + rectW; int rectH2 = rectH + rectH; int rectWM = 0 - rectW; int rectHM = 0 - rectH; int rectWM2 = 0 - rectW2; int rectHM2 = 0 - rectH2; double sizeRatio = 1.0 * _downRectangles[index].Height / _downRectangles[index].Width; switch (_currHitPlace) { // 左上 case HitDownSquare.HDS_LEFTTOP: # region // A if (changedX < 0 && changedY < 0) { if (changedX * sizeRatio > changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // AB if (changedX == 0 && changedY < 0) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // B if (0 < changedX && changedX < rectW && changedY < 0) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // BC if (changedX == rectW && changedY < 0) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // C if (rectW < changedX && changedX < rectW2 && changedY < 0) { changedX = rectW2 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // CC1 if (changedX == rectW2 && changedY < 0) { changedX = rectW2 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // C1 if (rectW2 < changedX && changedY < 0) { int changedABCX = changedX - rectW2; int changedABCY = Math.Abs(changedY); if (changedABCX * sizeRatio < changedABCY) { changedX = rectW2 + System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // AD if (changedX < 0 && changedY == 0) { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // ABDI if (changedX == 0 && changedY == 0) { rect = _downRectangles[index]; break; } // BI if (0 < changedX && changedX < rectW && changedY == 0) { rect = _downRectangles[index]; break; } // BCIE if (changedX == rectW && changedY == 0) { rect = _downRectangles[index]; break; } // CE if (rectW < changedX && changedX <= rectW2 && changedY == 0) { changedX = rectW2; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // CEC1E1 if (changedX == rectW2 && changedY == 0) { rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // C1E1 if (rectW2 < changedX && changedY == 0) { int changedABCX = changedX - rectW2; changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // D if (changedX < 0 && 0 < changedY && changedY < rectH) { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // DI if (changedX == 0 && 0 < changedY && changedY < rectH) { rect = _downRectangles[index]; break; } // I if (0 < changedX && changedX < rectW && 0 < changedY && changedY < rectH) { if (changedX * sizeRatio > changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // IE if (changedX == rectW && 0 < changedY && changedY < rectH) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // E if (rectW < changedX && changedX < rectW2 && 0 < changedY && changedY < rectH) { int changedABCX = rectW2 - changedX; int changedABCY = changedY; if (changedABCX * sizeRatio > changedABCY) { changedX = rectW2 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // EE1 if (changedX == rectW2 && 0 < changedY && changedY < rectH) { changedY = 0; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // E1 if (rectW2 < changedX && 0 < changedY && changedY < rectH) { int changedABCX = changedX - rectW2; changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // DF if (changedX < 0 && changedY == rectH) { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // DIFG if (changedX == 0 && changedY == rectH) { rect = _downRectangles[index]; break; } // IG if (0 < changedX && changedX < rectW && changedY == rectH) { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // IEGH if (changedX == rectW && changedY == rectH) { rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // EH if (rectW < changedX && changedX < rectW2 && changedY == rectH) { int changedABCX = rectW2 - changedX; changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // EE1HH1 if (changedX == rectW2 && changedY == rectH) { changedY = 0; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // E1H1 if (rectW2 < changedX && changedY == rectH) { int changedABCX = changedX - rectW2; changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // F if (changedX < 0 && rectH < changedY && changedY < rectH2) { changedY = rectH2 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // FG if (changedX == 0 && rectH < changedY && changedY < rectH2) { changedY = rectH2; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // G if (0 < changedX && changedX < rectW && rectH < changedY && changedY < rectH2) { int changedABCX = changedX; int changedABCY = rectH2 - changedY; if (changedABCX * sizeRatio > changedABCY) { changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectH2 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // GH if (changedX == rectW && rectH < changedY && changedY < rectH2) { int changedABCY = rectH2 - changedY; changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // H if (rectW < changedX && changedX < rectW2 && rectH < changedY && changedY < rectH2) { int changedABCX = rectW2 - changedX; int changedABCY = rectH2 - changedY; if (changedABCX * sizeRatio > changedABCY) { changedX = rectW2 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectH2 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // HH1 if (changedX == rectW2 && rectH < changedY && changedY < rectH2) { changedY = rectH2; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // H1 if (rectW2 < changedX && rectH < changedY && changedY < rectH2) { int changedABCX = changedX - rectW2; changedY = rectH2 + System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // FF1 if (changedX < 0 && changedY == rectH2) { changedY = rectH2 + System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // FGF1G1 if (changedX == 0 && changedY == rectH2) { rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // GG1 if (0 < changedX && changedX < rectW && changedY == rectH2) { changedX = 0; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // GHG1H2 if (changedX == rectW && changedY == rectH2) { changedX = 0; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // HH2 if (rectW < changedX && changedX < rectW2 && changedY == rectH2) { changedX = rectW2; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // HH1H2H3 if (changedX == rectW2 && changedY == rectH2) { rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // H1H3 if (rectW2 < changedX && changedY == rectH2) { int changedABCX = changedX - rectW2; changedY = rectH2 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // F1 if (changedX < 0 && rectH2 < changedY) { int changedABCX = Math.Abs(changedX); int changedABCY = changedY - rectH2; if (changedABCX * sizeRatio < changedABCY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectH2 + System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // F1G1 if (changedX == 0 && rectH2 < changedY) { int changedABCY = changedY - rectH2; changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // G1 if (0 < changedX && changedX < rectW && rectH2 < changedY) { int changedABCY = changedY - rectH2; changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // G1H2 if (changedX == rectW && rectH2 < changedY) { int changedABCY = changedY - rectH2; changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // H2 if (rectW < changedX && changedX < rectW2 && rectH2 < changedY) { int changedABCY = changedY - rectH2; changedX = rectW2 + System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // H2H3 if (changedX == rectW2 && rectH2 < changedY) { int changedABCY = changedY - rectH2; changedX = rectW2 + System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // H3 if (rectW2 < changedX && rectH2 < changedY) { int changedABCX = changedX - rectW2; int changedABCY = changedY - rectH2; if (changedABCX * sizeRatio < changedABCY) { changedX = rectW2 + System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectH2 + System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; } # endregion break; // 上中 case HitDownSquare.HDS_TOP: rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width; rect.Height = _downRectangles[index].Height - changedY; break; // 右上 case HitDownSquare.HDS_RIGHTTOP: # region // A1 if (changedX < rectWM2 && changedY < 0) { int changedABCX = rectWM2 - changedX; int changedABCY = Math.Abs(changedY); if (changedABCX * sizeRatio < changedABCY) { changedX = rectWM2 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // A1A if (changedX == rectWM2 && changedY < 0) { changedX = rectWM2 + System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // A if (rectWM2 < changedX && changedX < rectWM && changedY < 0) { changedX = rectWM2 + System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // AB if (changedX == rectWM && changedY < 0) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // B if (rectWM < changedX && changedX < 0 && changedY < 0) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // BC if (changedX == 0 && changedY < 0) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // C if (0 < changedX && changedY < 0) { int changedABCX = changedX; int changedABCY = Math.Abs(changedY); if (changedABCX * sizeRatio < changedABCY) { changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // A1D1 if (changedX < rectWM2 && changedY == 0) { int changedABCX = rectWM2 - changedX; changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // A1AD1D if (changedX == rectWM2 && changedY == 0) { rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height; break; } // AD if (rectWM2 < changedX && changedX < rectWM && changedY == 0) { changedX = rectWM2; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // ABDI if (changedX == rectWM && changedY == 0) { rect = _downRectangles[index]; break; } // BI if (rectWM < changedX && changedX < 0 && changedY == 0) { rect = _downRectangles[index]; break; } // BCIE if (changedX == 0 && changedY == 0) { rect = _downRectangles[index]; break; } // CE if (0 < changedX && changedY == 0) { changedY = 0 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // D1 if (changedX < rectWM2 && 0 < changedY && changedY < rectH) { int changedABCX = rectWM2 - changedX; changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // D1D if (changedX == rectWM2 && 0 < changedY && changedY < rectH) { changedY = 0; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // D if (rectWM2 < changedX && changedX < rectWM && 0 < changedY && changedY < rectH) { int changedABCX = changedX - rectWM2; int changedABCY = changedY; if (changedABCX * sizeRatio > changedABCY) { changedX = rectWM2 + System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // DI if (changedX == rectWM && 0 < changedY && changedY < rectH) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // I if (rectWM < changedX && changedX < 0 && 0 < changedY && changedY < rectH) { int changedABCX = Math.Abs(changedX); int changedABCY = changedY; if (changedABCX * sizeRatio > changedABCY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // IE if (changedX == 0 && 0 < changedY && changedY < rectH) { rect = _downRectangles[index]; break; } // E if (0 < changedX && 0 < changedY && changedY < rectH) { changedY = 0 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // D1F1 if (changedX < rectWM2 && changedY == rectH) { int changedABCX = rectWM2 - changedX; changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // D1DF1F if (changedX == rectWM2 && changedY == rectH) { changedY = 0; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // DF if (rectWM2 < changedX && changedX < rectWM && changedY == rectH) { int changedABCX = changedX - rectWM2; changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // DIFG if (changedX == rectWM && changedY == rectH) { rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // IG if (rectWM < changedX && changedX < 0 && changedY == rectH) { changedY = 0 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // IEGH if (changedX == 0 && changedY == rectH) { rect = _downRectangles[index]; break; } // EH if (0 < changedX && changedY == rectH) { changedY = 0 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // F1 if (changedX < rectWM2 && rectH < changedY && changedY < rectH2) { int changedABCX = Math.Abs(changedX); changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // F1F if (changedX == rectWM2 && rectH < changedY && changedY < rectH2) { changedY = rectH2; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // F if (rectWM2 < changedX && changedX < rectWM && rectH < changedY && changedY < rectH2) { int changedABCX = Math.Abs(changedX); int changedABCY = changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // FG if (changedX == rectWM && rectH < changedY && changedY < rectH2) { int changedABCY = changedY - rectH2; changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // G if (rectWM < changedX && changedX < 0 && rectH < changedY && changedY < rectH2) { int changedABCX = Math.Abs(changedX); int changedABCY = rectH2 - changedY; if (changedABCX * sizeRatio > changedABCY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectH2 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // GH if (changedX == 0 && rectH < changedY && changedY < rectH2) { changedY = rectH2; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // H if (0 < changedX && rectH < changedY && changedY < rectH2) { changedY = rectH2 + System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // F1F3 if (changedX < rectWM2 && changedY == rectH2) { int changedABCX = Math.Abs(changedX); changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // F1FF3F2 if (changedX == rectWM2 && changedY == rectH2) { changedY = rectH2; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // FF2 if (rectWM2 < changedX && changedX < rectWM && changedY == rectH2) { changedX = rectWM2; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // FGF2G1 if (changedX == rectWM && changedY == rectH2) { changedX = 0; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // GG1 if (rectWM < changedX && changedX < 0 && changedY == rectH2) { changedX = 0; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // GHG1H2 if (changedX == 0 && changedY == rectH2) { rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // HH2 if (0 < changedX && changedY == rectH2) { changedY = rectH2 + System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // F3 if (changedX < rectWM2 && rectH2 < changedY) { int changedABCX = Math.Abs(changedX); int changedABCY = changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // F3F2 if (changedX == rectWM2 && rectH2 < changedY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // F2 if (rectWM2 < changedX && changedX < rectWM && rectH2 < changedY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // F2G1 if (changedX == rectWM && rectH2 < changedY) { changedX = rectWM2 + System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // G1 if (rectWM < changedX && changedX < 0 && rectH2 < changedY) { changedX = rectWM2 + System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // G1H2 if (changedX == 0 && rectH2 < changedY) { changedX = rectWM2 + System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } // H2 if (0 < changedX && rectH2 < changedY) { int changedABCX = changedX; int changedABCY = changedY - rectH2; if (changedABCX * sizeRatio < changedABCY) { changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectH2 + System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; } # endregion break; // 左中 case HitDownSquare.HDS_LEFT: rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height; break; // 左下 case HitDownSquare.HDS_LEFTBOTTOM: # region // A2 if (changedX < 0 && changedY < rectHM2) { int changedABCX = Math.Abs(changedX); int changedABCY = rectHM2 - changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectHM2 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A2B1 if (0 == changedX && changedY < rectHM2) { int changedABCY = changedY - rectHM2; changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // B1 if (0 < changedX && changedX < rectW && changedY < rectHM2) { int changedABCY = changedY - rectHM2; changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // B1C2 if (changedX == rectW && changedY < rectHM2) { int changedABCY = changedY - rectHM2; changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // C2 if (rectW < changedX && changedX < rectW2 && changedY < rectHM2) { int changedABCY = Math.Abs(changedY); changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // C2C3 if (rectW2 == changedX && changedY < rectHM2) { int changedABCY = Math.Abs(changedY); changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // C3 if (rectW2 < changedX && changedY < rectHM2) { int changedABCX = changedX; int changedABCY = Math.Abs(changedY); if (changedABCX * sizeRatio < changedABCY) { changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A2A if (changedX < 0 && changedY == rectHM2) { changedY = rectHM2 + System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A2B1AB if (0 == changedX && changedY == rectHM2) { rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // B1B if (0 < changedX && changedX < rectW && changedY == rectHM2) { changedX = 0; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // B1C2BC if (changedX == rectW && changedY == rectHM2) { changedX = 0; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // C2C if (rectW < changedX && changedX < rectW2 && changedY == rectHM2) { changedX = rectW2; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // C2C3CC1 if (rectW2 == changedX && changedY == rectHM2) { rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // C3C1 if (rectW2 < changedX && changedY == rectHM2) { changedY = 0 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A if (changedX < 0 && rectHM2 < changedY && changedY < rectHM) { changedY = rectHM2 + System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // AB if (0 == changedX && rectHM2 < changedY && changedY < rectHM) { changedY = rectHM2; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // B if (0 < changedX && changedX < rectW && rectHM2 < changedY && changedY < rectHM) { int changedABCX = changedX; int changedABCY = changedY - rectHM2; if (changedABCX * sizeRatio > changedABCY) { changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectHM2 + System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // BC if (changedX == rectW && rectHM2 < changedY && changedY < rectHM) { int changedABCY = changedY - rectHM2; changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // C if (rectW < changedX && changedX < rectW2 && rectHM2 < changedY && changedY < rectHM) { int changedABCX = changedX; int changedABCY = Math.Abs(changedY); if (changedABCX * sizeRatio < changedABCY) { changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // CC1 if (rectW2 == changedX && rectHM2 < changedY && changedY < rectHM) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // C1 if (rectW2 < changedX && rectHM2 < changedY && changedY < rectHM) { changedY = 0 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // AD if (changedX < 0 && changedY == rectHM) { changedY = 0 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // ABDI if (0 == changedX && changedY == rectHM) { rect = _downRectangles[index]; break; } // BI if (0 < changedX && changedX < rectW && changedY == rectHM) { changedY = 0 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // BCIE if (changedX == rectW && changedY == rectHM) { rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // CE if (rectW < changedX && changedX < rectW2 && changedY == rectHM) { changedY = rectHM + System.Convert.ToInt32( Math.Round((changedX - rectW) * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // CC1EE1 if (rectW2 == changedX && changedY == rectHM) { changedY = 0; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // C1E1 if (rectW2 < changedX && changedY == rectHM) { changedY = System.Convert.ToInt32( Math.Round((changedX - rectW2) * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // D if (changedX < 0 && rectHM < changedY && changedY < 0) { changedY = 0 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // DI if (0 == changedX && rectHM < changedY && changedY < 0) { rect = _downRectangles[index]; break; } // I if (0 < changedX && changedX < rectW && rectHM < changedY && changedY < 0) { int changedABCX = changedX; int changedABCY = Math.Abs(changedY); if (changedABCX * sizeRatio > changedABCY) { changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = 0 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // IE if (changedX == rectW && rectHM < changedY && changedY < 0) { int changedABCY = Math.Abs(changedY); changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // E if (rectW < changedX && changedX < rectW2 && rectHM < changedY && changedY < 0) { int changedABCX = changedX - rectW; int changedABCY = changedY + rectH; if (changedABCX * sizeRatio < changedABCY) { changedX = rectW + System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectHM + System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // EE1 if (rectW2 == changedX && rectHM < changedY && changedY < 0) { changedY = 0; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // E1 if (rectW2 < changedX && rectHM < changedY && changedY < 0) { changedY = System.Convert.ToInt32( Math.Round((changedX - rectW2) * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // DF if (changedX < 0 && changedY == 0) { changedY = 0 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // DIFG if (0 == changedX && changedY == 0) { rect = _downRectangles[index]; break; } // IG if (0 < changedX && changedX < rectW && changedY == 0) { rect = _downRectangles[index]; break; } // IEGH if (changedX == rectW && changedY == 0) { rect = _downRectangles[index]; break; } // EH if (rectW < changedX && changedX < rectW2 && changedY == 0) { changedY = 0; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // EE1HH1 if (rectW2 == changedX && changedY == 0) { changedY = 0; rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // E1H1 if (rectW2 < changedX && changedY == 0) { changedY = System.Convert.ToInt32( Math.Round((changedX - rectW2) * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // F if (changedX < 0 && 0 < changedY) { int changedABCX = Math.Abs(changedX); int changedABCY = changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // FG if (0 == changedX && 0 < changedY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // G if (0 < changedX && changedX < rectW && 0 < changedY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // GH if (changedX == rectW && 0 < changedY) { changedX = 0 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // H if (rectW < changedX && changedX < rectW2 && 0 < changedY) { int changedABCY = changedY + rectH; changedX = rectW + System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // HH1 if (rectW2 == changedX && 0 < changedY) { int changedABCY = changedY + rectH; changedX = rectW + System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // H1 if (rectW2 < changedX && 0 < changedY) { int changedABCX = changedX - rectW2; int changedABCY = changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = rectW + System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; } # endregion break; // 右中 case HitDownSquare.HDS_RIGHT: rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height; break; // 下中 case HitDownSquare.HDS_BOTTOM: rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width; rect.Height = _downRectangles[index].Height + changedY; break; // 右下 case HitDownSquare.HDS_RIGHTBOTTOM: # region // A3 if (changedX < rectWM2 && changedY < rectHM2) { if (changedX * sizeRatio > changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A3A2 if (changedX == rectWM2 && changedY < rectHM2) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A2 if (rectWM2 < changedX && changedX < rectWM && changedY < rectHM2) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A2B1 if (changedX == rectWM && changedY < rectHM2) { changedX = System.Convert.ToInt32( Math.Round((rectHM2 - changedY) / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // B1 if (rectWM < changedX && changedX < 0 && changedY < rectHM2) { changedX = System.Convert.ToInt32( Math.Round((rectHM2 - changedY) / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // B1C2 if (changedX == 0 && changedY < rectHM2) { changedX = System.Convert.ToInt32( Math.Round((rectHM2 - changedY) / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // C2 if (0 < changedX && changedY < rectHM2) { int changedABCX = changedX; int changedABCY = rectHM2 - changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectHM2 - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A3A1 if (changedX < rectWM2 && changedY == rectHM2) { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A3A2A1A if (changedX == rectWM2 && changedY == rectHM2) { rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A2A if (rectWM2 < changedX && changedX < rectWM && changedY == rectHM2) { changedX = rectWM2; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A2B1AB if (changedX == rectWM && changedY == rectHM2) { changedX = 0; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // B1B if (rectWM < changedX && changedX < 0 && changedY == rectHM2) { changedX = 0; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // B1C2BC if (changedX == 0 && changedY == rectHM2) { rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // C2C if (0 < changedX && changedY == rectHM2) { changedY = rectHM2 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A1 if (changedX < rectWM2 && rectHM2 < changedY && changedY < rectHM) { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A1A if (changedX == rectWM2 && rectHM2 < changedY && changedY < rectHM) { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A if (rectWM2 < changedX && changedX < rectWM && rectHM2 < changedY && changedY < rectHM) { if (changedX * sizeRatio > changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // AB if (changedX == rectWM && rectHM2 < changedY && changedY < rectHM) { changedX = rectWM - System.Convert.ToInt32( Math.Round((changedY + rectH) / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // B if (rectWM < changedX && changedX < 0 && rectHM2 < changedY && changedY < rectHM) { int changedABCX = rectW + changedX; int changedABCY = rectHM - changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = rectWM + System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectHM - System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // BC if (changedX == 0 && rectHM2 < changedY && changedY < rectHM) { changedY = rectHM2; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // C if (0 < changedX && rectHM2 < changedY && changedY < rectHM) { changedY = rectHM2 - System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A1D1 if (changedX < rectWM2 && changedY == rectHM) { changedY = System.Convert.ToInt32( Math.Round((rectWM2 - changedX) * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // A1AD1D if (changedX == rectWM2 && changedY == rectHM) { changedX = rectWM2; changedY = 0; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // AD if (rectWM2 < changedX && changedX < rectWM && changedY == rectHM) { changedY = System.Convert.ToInt32( Math.Round((rectWM + changedX) * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // ABDI if (changedX == rectWM && changedY == rectHM) { rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // BI if (rectWM < changedX && changedX < 0 && changedY == rectHM) { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // BCIE if (changedX == 0 && changedY == rectHM) { rect = _downRectangles[index]; break; } // CE if (0 < changedX && changedY == rectHM) { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // D1 if (changedX < rectWM2 && rectHM < changedY && changedY < 0) { changedY = System.Convert.ToInt32( Math.Round((rectWM2 - changedX) * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // D1D if (changedX == rectWM2 && rectHM < changedY && changedY < 0) { changedX = rectWM2; changedY = 0; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // D if (rectWM2 < changedX && changedX < rectWM && rectHM < changedY && changedY < 0) { int changedABCX = rectWM - changedX; int changedABCY = rectH + changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = rectWM - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = rectHM + System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // DI if (changedX == rectWM && rectHM < changedY && changedY < 0) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // I if (rectWM < changedX && changedX < 0 && rectHM < changedY && changedY < 0) { if (changedX * sizeRatio < changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // IE if (changedX == 0 && rectHM < changedY && changedY < 0) { rect = _downRectangles[index]; break; } // E if (0 < changedX && rectHM < changedY && changedY < 0) { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // D1F1 if (changedX < rectWM2 && changedY == 0) { changedY = System.Convert.ToInt32( Math.Round((rectWM2 - changedX) * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // D1DF1F if (changedX == rectWM2 && changedY == 0) { changedX = rectWM2; changedY = 0; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // DF if (rectWM2 < changedX && changedX < rectWM && changedY == 0) { changedX = rectWM2; changedY = 0; rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // DIFG if (changedX == rectWM && changedY == 0) { rect = _downRectangles[index]; break; } // IG if (rectWM < changedX && changedX < 0 && changedY == 0) { rect = _downRectangles[index]; break; } // IEGH if (changedX == 0 && changedY == 0) { rect = _downRectangles[index]; break; } // EH if (0 < changedX && changedY == 0) { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // F1 if (changedX < rectWM2 && 0 < changedY) { int changedABCX = rectWM2 - changedX; int changedABCY = changedY; if (changedABCX * sizeRatio < changedABCY) { changedX = rectWM2 - System.Convert.ToInt32( Math.Round(changedABCY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedABCX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // F1F if (changedX == rectWM2 && 0 < changedY) { changedX = rectWM2 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // F if (rectWM2 < changedX && changedX < rectWM && 0 < changedY) { changedX = rectHM2 - System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // FG if (changedX == rectWM && 0 < changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // G if (rectWM < changedX && changedX < 0 && 0 < changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // GH if (changedX == 0 && 0 < changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } // H if (0 < changedX && 0 < changedY) { if (changedX * sizeRatio < changedY) { changedX = System.Convert.ToInt32( Math.Round(changedY / sizeRatio, 0, MidpointRounding.AwayFromZero)); } else { changedY = System.Convert.ToInt32( Math.Round(changedX * sizeRatio, 0, MidpointRounding.AwayFromZero)); } rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; } # endregion break; default: break; } } # endregion } else if (_isShiftDown) { # region int changedX = p.X - _startX; int changedY = p.Y - _startY; switch (_currHitPlace) { // 左上 case HitDownSquare.HDS_LEFTTOP: rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; // 上中 case HitDownSquare.HDS_TOP: rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width; rect.Height = _downRectangles[index].Height - changedY - changedY; break; // 右上 case HitDownSquare.HDS_RIGHTTOP: rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height - changedY - changedY; break; // 左中 case HitDownSquare.HDS_LEFT: rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height; break; // 左下 case HitDownSquare.HDS_LEFTBOTTOM: rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width - changedX - changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; // 右中 case HitDownSquare.HDS_RIGHT: rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height; break; // 下中 case HitDownSquare.HDS_BOTTOM: rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width; rect.Height = _downRectangles[index].Height + changedY + changedY; break; // 右下 case HitDownSquare.HDS_RIGHTBOTTOM: rect.X = _downRectangles[index].Left - changedX; rect.Y = _downRectangles[index].Top - changedY; rect.Width = _downRectangles[index].Width + changedX + changedX; rect.Height = _downRectangles[index].Height + changedY + changedY; break; // Move case HitDownSquare.HDS_MOVE: int changedABCX = Math.Abs(changedX); int changedABCY = Math.Abs(changedY); if (changedABCX < changedABCY) { rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; } else { rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; } rect.Width = _downRectangles[index].Width; rect.Height = _downRectangles[index].Height; break; default: break; } # endregion } else { # region int changedX = p.X - _startX; int changedY = p.Y - _startY; switch (_currHitPlace) { // 左上 case HitDownSquare.HDS_LEFTTOP: rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height - changedY; break; // 上中 case HitDownSquare.HDS_TOP: rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width; rect.Height = _downRectangles[index].Height - changedY; break; // 右上 case HitDownSquare.HDS_RIGHTTOP: rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height - changedY; break; // 左中 case HitDownSquare.HDS_LEFT: rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height; break; // 右中 case HitDownSquare.HDS_RIGHT: rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height; break; // 左下 case HitDownSquare.HDS_LEFTBOTTOM: rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width - changedX; rect.Height = _downRectangles[index].Height + changedY; break; // 下中 case HitDownSquare.HDS_BOTTOM: rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width; rect.Height = _downRectangles[index].Height + changedY; break; // 右下 case HitDownSquare.HDS_RIGHTBOTTOM: rect.X = _downRectangles[index].Left; rect.Y = _downRectangles[index].Top; rect.Width = _downRectangles[index].Width + changedX; rect.Height = _downRectangles[index].Height + changedY; break; // Move case HitDownSquare.HDS_MOVE: rect.X = _downRectangles[index].Left + changedX; rect.Y = _downRectangles[index].Top + changedY; rect.Width = _downRectangles[index].Width; rect.Height = _downRectangles[index].Height; break; default: break; } # endregion } if (_isRealFollow) { DragHandler(index); } else { DrawReversibleFrame(_itemLockTyps[index], _moveRectangles[index], rect); } _moveRectangles[index] = rect; } /// /// 绘制范围需框 /// /// item锁定类别 /// 原范围 /// 当前范围 private void DrawReversibleFrame(ItemLock itemLock, Rectangle? rectOriginal, Rectangle? rectCurrent) { // 需框范围 if (_item != null && _item.Owner != null) { if (itemLock == ItemLock.LockLocationAndSize) { return; } if (itemLock == ItemLock.LockSize) { if (_currHitPlace != HitDownSquare.HDS_MOVE && _currHitPlace != HitDownSquare.HDS_NONE) { return; } } if (rectCurrent.HasValue) { Rectangle rect = rectCurrent.Value; rect.Width += 1; rect.Height += 1; _item.Owner.DrawReversibleFrame(rect); } if (rectOriginal.HasValue && _isMouseMoveInPaperArea) { Rectangle rect = rectOriginal.Value; rect.Width += 1; rect.Height += 1; _item.Owner.DrawReversibleFrame(rect); } } } /// /// 改变图形位置尺寸 /// /// 选择Item的索引 private void DragHandler(int index) { ItemLock itemLock = _itemLockTyps[index]; if (itemLock == ItemLock.LockLocationAndSize) { return; } else if (itemLock == ItemLock.LockSize) { if (_currHitPlace == HitDownSquare.HDS_MOVE || _currHitPlace == HitDownSquare.HDS_NONE) { } else { return; } } else { } Rectangle rect = _moveRectangles[index]; LayoutItem item = _item.Owner.SelectedItems[index]; int top = 0; int left = 0; int width = 0; int height = 0; if (rect.Width < 0) { left = rect.Right; width -= rect.Width; } else { left = rect.Left; width = rect.Width; } if (rect.Height < 0) { top = rect.Bottom; height -= rect.Height; } else { top = rect.Top; height = rect.Height; } // 图形超出Layout范围 if (left < 0 || item.Owner.MaxItemLeft < left || top < 0 || item.Owner.MaxItemTop < top || width < item.Owner.MinItemWidth || item.Owner.MaxItemWidth < width || height < item.Owner.MinItemHeight || item.Owner.MaxItemHeight < height || item.Owner.PaperArea.Width - 1 < left || item.Owner.PaperArea.Height - 1 < top ) { return; } item.MoveItem(left, top); item.ChangeItemSize(width, height); item.ResetItemFrame(); } /// /// 可视化范围设置 /// /// 可视化范围 private GraphicsPath SetViewRectangle() { GraphicsPath path = new GraphicsPath(); if (_item == null) { return path; } // 左上 _handlerRect[0] = new Rectangle(0, 0, SQUARE_WIDTH, SQUARE_WIDTH); // 右上 _handlerRect[1] = new Rectangle(Bounds.Width - SQUARE_WIDTH, 0, SQUARE_WIDTH, SQUARE_WIDTH); // 左下 _handlerRect[2] = new Rectangle(0, Bounds.Height - SQUARE_WIDTH, SQUARE_WIDTH, SQUARE_WIDTH); // 右下 _handlerRect[3] = new Rectangle(_handlerRect[1].X, _handlerRect[2].Y, SQUARE_WIDTH, SQUARE_WIDTH); // 上中 _handlerRect[4] = new Rectangle((Bounds.Width) / 2 - SQUARE_WIDTH_HALF, 0, SQUARE_WIDTH, SQUARE_WIDTH); // 下中 _handlerRect[5] = new Rectangle(_handlerRect[4].X, _handlerRect[2].Y, SQUARE_WIDTH, SQUARE_WIDTH); // 左中 _handlerRect[6] = new Rectangle(0, (Bounds.Height) / 2 - SQUARE_WIDTH_HALF, SQUARE_WIDTH, SQUARE_WIDTH); // 右中 _handlerRect[7] = new Rectangle(_handlerRect[1].X, _handlerRect[6].Y, SQUARE_WIDTH, SQUARE_WIDTH); for (int i = 0; i < 8; i++) { _handlerDrawRect[i] = _handlerRect[i]; _handlerDrawRect[i].Width--; _handlerDrawRect[i].Height--; } path.AddRectangles(_handlerRect); if (_lock != ItemLock.LockLocationAndSize) { // 上左 _sideRect[0] = new Rectangle( _handlerRect[0].X + SQUARE_WIDTH, _handlerRect[0].Y + SQUARE_WIDTH_HALF, _handlerRect[4].X - _handlerRect[0].X - SQUARE_WIDTH, 1 ); // 上右 _sideRect[1] = new Rectangle( _handlerRect[4].X + SQUARE_WIDTH, _sideRect[0].Y, _handlerRect[1].X - _handlerRect[4].X - SQUARE_WIDTH, 1 ); // 左上 _sideRect[2] = new Rectangle( _handlerRect[0].X + SQUARE_WIDTH_HALF, _handlerRect[0].Y + SQUARE_WIDTH, 1, _handlerRect[6].Y - _handlerRect[0].Y - SQUARE_WIDTH ); // 左下 _sideRect[3] = new Rectangle( _sideRect[2].X, _handlerRect[6].Y + SQUARE_WIDTH, 1, _handlerRect[2].Y - _handlerRect[6].Y - SQUARE_WIDTH ); // 下左 _sideRect[4] = new Rectangle( _sideRect[0].X, _handlerRect[2].Y + SQUARE_WIDTH_HALF, _sideRect[0].Width, 1 ); // 下右 _sideRect[5] = new Rectangle( _sideRect[1].X, _sideRect[4].Y, _sideRect[1].Width, 1 ); // 右上 _sideRect[6] = new Rectangle( _handlerRect[1].X + SQUARE_WIDTH_HALF, _sideRect[2].Y, 1, _sideRect[2].Height ); // 右下 _sideRect[7] = new Rectangle( _sideRect[6].X, _handlerRect[7].Y + SQUARE_WIDTH, 1, _sideRect[3].Height ); _sideDrawRect = new Rectangle( SQUARE_WIDTH_HALF, SQUARE_WIDTH_HALF, Bounds.Width - SQUARE_WIDTH, Bounds.Height - SQUARE_WIDTH ); path.AddRectangles(_sideRect); } return path; } /// /// 绘制边框。 /// private void DrawFrame(Graphics graphics) { if (_item == null) { return; } using (Pen pen = new Pen(Color.Black, 1)) { pen.DashStyle = DashStyle.Solid; if (_lock == ItemLock.None) { graphics.FillRectangles(Brushes.White, _handlerRect); graphics.DrawRectangles(pen, _handlerDrawRect); } else { graphics.FillRectangles(Brushes.Black, _handlerRect); } if (_lock != ItemLock.LockLocationAndSize) { // 显示框的范围 pen.DashStyle = DashStyle.Dash; graphics.DrawRectangle(pen, _sideDrawRect); } } } /// /// 根据鼠标位置设置操作类型。 /// /// 鼠标坐标点 /// /// true :有操作 /// false:无操作 /// private bool Pointer(Point point) { if (_lock == ItemLock.LockLocationAndSize) { _currHitPlace = HitDownSquare.HDS_NONE; return false; } if (_handlerRect8.Contains(point) || _sideRect[0].Contains(point) || _sideRect[1].Contains(point) || _sideRect[2].Contains(point) || _sideRect[3].Contains(point) || _sideRect[4].Contains(point) || _sideRect[5].Contains(point) || _sideRect[6].Contains(point) || _sideRect[7].Contains(point) ) { Cursor.Current = Cursors.SizeAll; _currHitPlace = HitDownSquare.HDS_MOVE; return true; } if (_lock == ItemLock.LockSize) { _currHitPlace = HitDownSquare.HDS_NONE; return false; } if (!ClientRectangle.Contains(point)) { _currHitPlace = HitDownSquare.HDS_NONE; return false; } // 左上 if (_handlerRect[0].Contains(point)) { Cursor.Current = Cursors.SizeNWSE; _currHitPlace = HitDownSquare.HDS_LEFTTOP; return true; } // 右下 if (_handlerRect[3].Contains(point)) { Cursor.Current = Cursors.SizeNWSE; _currHitPlace = HitDownSquare.HDS_RIGHTBOTTOM; return true; } // 右上 if (_handlerRect[1].Contains(point)) { Cursor.Current = Cursors.SizeNESW; _currHitPlace = HitDownSquare.HDS_RIGHTTOP; return true; } // 左下 if (_handlerRect[2].Contains(point)) { Cursor.Current = Cursors.SizeNESW; _currHitPlace = HitDownSquare.HDS_LEFTBOTTOM; return true; } // 上中 if (_handlerRect[4].Contains(point)) { Cursor.Current = Cursors.SizeNS; _currHitPlace = HitDownSquare.HDS_TOP; return true; } // 下中 if (_handlerRect[5].Contains(point)) { Cursor.Current = Cursors.SizeNS; _currHitPlace = HitDownSquare.HDS_BOTTOM; return true; } // 左中 if (_handlerRect[6].Contains(point)) { Cursor.Current = Cursors.SizeWE; _currHitPlace = HitDownSquare.HDS_LEFT; return true; } // 右中 if (_handlerRect[7].Contains(point)) { Cursor.Current = Cursors.SizeWE; _currHitPlace = HitDownSquare.HDS_RIGHT; return true; } // 移动 if (_handlerRect8.Contains(point) || _sideRect[0].Contains(point) || _sideRect[1].Contains(point) || _sideRect[2].Contains(point) || _sideRect[3].Contains(point) || _sideRect[4].Contains(point) || _sideRect[5].Contains(point) || _sideRect[6].Contains(point) || _sideRect[7].Contains(point) ) { Cursor.Current = Cursors.SizeAll; _currHitPlace = HitDownSquare.HDS_MOVE; return true; } return false; } #endregion 函数 } }