From 36ef3415fb666dfbe972a6afda276ebc0109aa9f Mon Sep 17 00:00:00 2001 From: zqm Date: Fri, 7 Nov 2025 15:26:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=80=89=E4=B8=AD=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E6=97=B6=E9=BC=A0=E6=A0=87=E5=8F=AF=E4=BB=A5=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E5=8C=BA=E5=9F=9F=E7=9A=84=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E8=B0=83=E6=95=B4=E5=8C=BA=E5=9F=9F=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CS/Framework4.0/Toprie/Toprie/Setting.cs | 69 +++++++++++++++++-- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs index 1e2325e..c1dad80 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs @@ -42,6 +42,10 @@ namespace JoyD.Windows.CS private Point _resizeStartPoint; private Rectangle _originalRectangle; + // 区域移动相关变量 + private bool _isMoving = false; + private Point _startMovePoint; + public Setting() { InitializeComponent(); @@ -95,7 +99,7 @@ namespace JoyD.Windows.CS // 刷新绘制 picBoxTemp.Invalidate(); } - // 处理选中区域的调整大小 + // 处理选中区域的调整大小或移动 else if (e.Button == MouseButtons.Left && !_isDrawingMode && _selectedRegionIndex != -1) { RegionInfo selectedRegion = _drawnRectangles.FirstOrDefault(r => r.Index == _selectedRegionIndex); @@ -113,6 +117,13 @@ namespace JoyD.Windows.CS _resizeStartPoint = e.Location; _originalRectangle = controlRectangle; } + else if (controlRectangle.Contains(e.Location)) + { + // 开始移动区域 + _isMoving = true; + _startMovePoint = e.Location; + picBoxTemp.Cursor = Cursors.SizeAll; + } } } // 处理左击开始绘制矩形 @@ -216,7 +227,7 @@ namespace JoyD.Windows.CS /// - /// 鼠标移动事件 - 更新矩形大小、检测鼠标悬停区域或更新光标 + /// 鼠标移动事件 - 更新矩形大小、移动区域、检测鼠标悬停区域或更新光标 /// private void PicBoxTemp_MouseMove(object sender, MouseEventArgs e) { @@ -251,6 +262,48 @@ namespace JoyD.Windows.CS } } } + // 处理移动区域 + else if (_isMoving && !_isDrawingMode && _selectedRegionIndex != -1) + { + RegionInfo selectedRegion = _drawnRectangles.FirstOrDefault(r => r.Index == _selectedRegionIndex); + if (selectedRegion != null) + { + // 计算移动距离 + int deltaX = e.Location.X - _startMovePoint.X; + int deltaY = e.Location.Y - _startMovePoint.Y; + + // 转换为图像坐标的移动距离 + float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width; + float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height; + int imageDeltaX = (int)(deltaX * scaleX); + int imageDeltaY = (int)(deltaY * scaleY); + + // 计算新的矩形位置 + Rectangle newRect = new Rectangle( + selectedRegion.ImageRectangle.X + imageDeltaX, + selectedRegion.ImageRectangle.Y + imageDeltaY, + selectedRegion.ImageRectangle.Width, + selectedRegion.ImageRectangle.Height + ); + + // 确保矩形不会移出图像边界 + if (newRect.Left >= 0 && newRect.Top >= 0 && + newRect.Right <= picBoxTemp.Image.Width && + newRect.Bottom <= picBoxTemp.Image.Height) + { + selectedRegion.ImageRectangle = newRect; + + // 更新起始点,为下一次移动做准备 + _startMovePoint = e.Location; + + // 重新创建叠加层以反映变化 + CreateRectangleOverlayImage(); + + // 触发重绘 + picBoxTemp.Invalidate(); + } + } + } // 处理绘制新矩形 else if (_isDrawing && _isDrawingMode) { @@ -292,7 +345,7 @@ namespace JoyD.Windows.CS } // 如果没有悬停在句柄上,检查是否悬停在区域上 - if (_currentHandle == ResizeHandle.None) + if (_currentHandle == ResizeHandle.None && !_isMoving) { // 将鼠标坐标转换为图像坐标 Point imagePoint = ControlPointToImagePoint(e.Location); @@ -420,7 +473,7 @@ namespace JoyD.Windows.CS } /// - /// 鼠标释放事件 - 完成矩形绘制或调整大小 + /// 鼠标释放事件 - 完成矩形绘制、调整大小或移动 /// 使用增量绘制,避免每次都重绘所有矩形 /// 确保矩形坐标相对于图像而非控件 /// @@ -435,6 +488,14 @@ namespace JoyD.Windows.CS return; } + // 结束移动区域 + if (_isMoving && e.Button == MouseButtons.Left) + { + _isMoving = false; + picBoxTemp.Cursor = Cursors.Default; + return; + } + // 结束绘制新矩形 if (_isDrawing && _isDrawingMode && e.Button == MouseButtons.Left && picBoxTemp.Image != null) {