From 6adf47ac2affe7bcac8ab3f816257f11de9d037f Mon Sep 17 00:00:00 2001 From: zqm Date: Tue, 11 Nov 2025 10:09:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=93=A6=E9=99=A4=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E9=80=BB=E8=BE=91=EF=BC=8C=E7=A1=AE=E4=BF=9D=E6=93=A6?= =?UTF-8?q?=E9=99=A4=E7=94=BB=E7=AC=94=E5=A4=A7=E5=B0=8F=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E5=9B=BE=E5=83=8F=E7=BC=A9=E6=94=BE=E6=AF=94=E4=BE=8B=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E8=B0=83=E6=95=B4=EF=BC=8C=E4=BD=BF=E8=A7=86=E8=A7=89?= =?UTF-8?q?=E6=95=88=E6=9E=9C=E4=B8=8E=E5=85=89=E6=A0=87=E5=9D=97=E4=BF=9D?= =?UTF-8?q?=E6=8C=81=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CS/Framework4.0/Toprie/Toprie/Setting.cs | 58 ++++++++++++++++--- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs index b16b6a5..417904a 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs @@ -1545,27 +1545,45 @@ namespace JoyD.Windows.CS g.InterpolationMode = InterpolationMode.NearestNeighbor; if (_isEraseMode) - { + { // 擦除模式:使用透明色填充,设置CompositingMode为清除 g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy; + // 计算考虑图像缩放比例的画笔大小 + // 由于我们需要让实际擦除区域在视觉上与光标块大小一致 + // 这里需要根据图像缩放比例来调整画笔大小 + int adjustedBrushSize = _currentBrushSize; + if (picBoxTemp.Image != null) + { + // 计算控件到图像的缩放比例(图像实际大小与控件显示大小的比例) + float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width; + float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height; + + // 使用缩放比例调整画笔大小,使擦除区域在视觉上与光标块一致 + adjustedBrushSize = (int)(_currentBrushSize * Math.Min(scaleX, scaleY)); + + // 确保调整后的画笔大小不会太小或太大 + adjustedBrushSize = Math.Max(adjustedBrushSize, 1); // 最小1像素 + adjustedBrushSize = Math.Min(adjustedBrushSize, 50); // 最大50像素 + } + // 如果是首次擦除或上一个点无效,记录当前点作为起点 if (_lastDrawPoint == Point.Empty) - { + { _lastDrawPoint = imagePoint; // 绘制起始点的圆形(擦除区域) - int radius = _currentBrushSize / 2; + int radius = adjustedBrushSize / 2; g.FillEllipse(Brushes.Transparent, imagePoint.X - radius, imagePoint.Y - radius, - _currentBrushSize, - _currentBrushSize); + adjustedBrushSize, + adjustedBrushSize); } else - { - // 使用透明色绘制粗线条进行擦除 - using (Pen pen = new Pen(Color.Transparent, _currentBrushSize)) - { + { + // 使用透明色绘制粗线条进行擦除,使用调整后的画笔大小 + using (Pen pen = new Pen(Color.Transparent, adjustedBrushSize)) + { pen.StartCap = LineCap.Round; pen.EndCap = LineCap.Round; pen.LineJoin = LineJoin.Round; @@ -1911,7 +1929,29 @@ namespace JoyD.Windows.CS { // 擦除模式:使用透明色填充,设置CompositingMode为清除 g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy; + + // 计算考虑图像缩放比例的画笔大小 + // 由于我们需要让实际擦除区域在视觉上与光标块大小一致 + int adjustedBrushSize = _currentBrushSize; + if (picBoxTemp.Image != null) + { + // 计算控件到图像的缩放比例(图像实际大小与控件显示大小的比例) + float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width; + float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height; + + // 使用缩放比例调整画笔大小,使擦除区域在视觉上与光标块一致 + adjustedBrushSize = (int)(_currentBrushSize * Math.Min(scaleX, scaleY)); + + // 确保调整后的画笔大小不会太小或太大 + adjustedBrushSize = Math.Max(adjustedBrushSize, 1); // 最小1像素 + adjustedBrushSize = Math.Min(adjustedBrushSize, 50); // 最大50像素 + } + + // 使用调整后的画笔大小填充矩形 + // 为了保持与光标一致的视觉效果,我们需要使用画笔大小来调整擦除行为 + // 这里我们直接填充整个矩形,但使用与画笔大小相匹配的方式 g.FillRectangle(Brushes.Transparent, _tempDiffTempRectangle); + g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver; } else