From a96e2e3a6bed88da96b109f1ac0de75e37dffc77 Mon Sep 17 00:00:00 2001 From: zqm Date: Mon, 10 Nov 2025 17:14:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B8=A9=E5=B7=AE=E5=9B=BE?= =?UTF-8?q?=E7=BB=98=E5=88=B6=E9=80=BB=E8=BE=91=EF=BC=9A=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A=EF=BC=8C=E6=98=8E=E7=A1=AE?= =?UTF-8?q?=E5=9F=BA=E4=BA=8E=E5=85=89=E6=A0=87=E8=A7=86=E8=A7=89=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=E7=9A=84=E7=94=BB=E7=AC=94=E7=BC=A9=E6=94=BE=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CS/Framework4.0/Toprie/Toprie/Setting.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs index 026acc3..85c8a1b 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs @@ -652,11 +652,15 @@ namespace JoyD.Windows.CS // 获取相对于图像的坐标作为矩形起始点 Point imagePoint = ControlPointToImagePoint(e.Location); - // 计算画笔大小在图像坐标系统中的缩放值 + // 画笔大小应该基于鼠标光标的实际视觉大小 + // 在控件坐标系中,画笔大小就是用户感知的光标大小 + // 需要将控件坐标系统中的画笔大小转换为图像坐标系统 + // 计算反向缩放比例:将控件坐标转换为图像坐标的比例 float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width; float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height; - // 按下鼠标时初始框以鼠标位置为中心,大小为画笔大小(根据缩放比例调整) + // 按下鼠标时初始框以鼠标位置为中心,大小为画笔大小(根据图像缩放比例调整) + // 这样无论图像如何缩放,画笔大小在用户视觉上始终保持与光标大小一致 float scaledHalfBrushSizeX = _currentBrushSize / 2 * scaleX; float scaledHalfBrushSizeY = _currentBrushSize / 2 * scaleY; @@ -1280,7 +1284,8 @@ namespace JoyD.Windows.CS // 获取相对于图像的当前坐标 Point currentImagePoint = ControlPointToImagePoint(e.Location); - // 计算矩形参数:左上点是起笔方块的左上点,右下点是当前鼠标位置+画笔一半的宽高(考虑缩放比例) + // 计算矩形参数:左上点是起笔方块的左上点,右下点是当前鼠标位置+画笔一半的宽高(基于光标大小) + // 使用反向缩放比例:将控件坐标中的光标大小转换为图像坐标 float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width; float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height; float scaledHalfBrushSizeX = _currentBrushSize / 2 * scaleX; @@ -1288,7 +1293,7 @@ namespace JoyD.Windows.CS int x = _rectangleStartPoint.X; int y = _rectangleStartPoint.Y; - // 右下角为当前鼠标位置+画笔一半的宽高(根据缩放比例调整) + // 右下角为当前鼠标位置+画笔一半的宽高(基于光标大小转换) Point endPoint = new Point( (int)(currentImagePoint.X + scaledHalfBrushSizeX), (int)(currentImagePoint.Y + scaledHalfBrushSizeY) @@ -1771,7 +1776,8 @@ namespace JoyD.Windows.CS // 获取相对于图像的当前坐标 Point currentImagePoint = ControlPointToImagePoint(e.Location); - // 计算矩形参数:左上点是起笔方块的左上点,右下点是当前鼠标位置+画笔一半的宽高(考虑缩放比例) + // 计算矩形参数:左上点是起笔方块的左上点,右下点是当前鼠标位置+画笔一半的宽高(基于光标大小) + // 使用反向缩放比例:将控件坐标中的光标大小转换为图像坐标 float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width; float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height; float scaledHalfBrushSizeX = _currentBrushSize / 2 * scaleX; @@ -1779,7 +1785,7 @@ namespace JoyD.Windows.CS int x = _rectangleStartPoint.X; int y = _rectangleStartPoint.Y; - // 右下角为当前鼠标位置+画笔一半的宽高(根据缩放比例调整) + // 右下角为当前鼠标位置+画笔一半的宽高(基于光标大小转换) Point endPoint = new Point( (int)(currentImagePoint.X + scaledHalfBrushSizeX), (int)(currentImagePoint.Y + scaledHalfBrushSizeY)