From 28a9846da60e8bf8aa2b62cf838ab90499ca9048 Mon Sep 17 00:00:00 2001 From: zqm Date: Tue, 11 Nov 2025 10:13:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=B8=A9=E5=B7=AE=E5=9B=BE?= =?UTF-8?q?=E7=BB=98=E5=88=B6=E7=8A=B6=E6=80=81=E4=B8=8B=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E5=87=BB=E7=BB=98=E5=88=B6=E5=92=8C=E6=93=A6=E9=99=A4=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CS/Framework4.0/Toprie/Toprie/Setting.cs | 106 +++++++++++++++++- 1 file changed, 104 insertions(+), 2 deletions(-) diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs index 417904a..207ded8 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs @@ -2746,11 +2746,113 @@ namespace JoyD.Windows.CS } /// - /// 鼠标点击事件 - 处理区域选中和右击退出选中状态 + /// 鼠标点击事件 - 处理区域选中、右击退出选中状态,以及温差图绘制状态下的单击绘制和擦除 /// private void PicBoxTemp_MouseClick(object sender, MouseEventArgs e) { - // 如果处于温差图绘制状态,不执行任何操作(只有右击在MouseDown事件中处理退出) + // 温差图绘制状态下处理左键单击 + if (_isTempDiffDrawingMode && e.Button == MouseButtons.Left && picBoxTemp.Image != null && !_isDrawingRectangle) + { + // 初始化温差层图像(如果不存在或尺寸不匹配) + if (_tempDiffOverlayImage == null || + _tempDiffOverlayImage.Width != picBoxTemp.Image.Width || + _tempDiffOverlayImage.Height != picBoxTemp.Image.Height) + { + InitializeTempDiffOverlayImage(); + } + + // 获取相对于图像的坐标 + Point imagePoint = ControlPointToImagePoint(e.Location); + + // 在温差层图像上绘制/擦除 + using (Graphics g = Graphics.FromImage(_tempDiffOverlayImage)) + { + // 取消抗锯齿,使用最近邻插值,获得边界清晰的图像 + g.SmoothingMode = SmoothingMode.None; + 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像素 + } + + // 绘制擦除区域(圆形) + int radius = adjustedBrushSize / 2; + g.FillEllipse(Brushes.Transparent, imagePoint.X - radius, imagePoint.Y - radius, adjustedBrushSize, adjustedBrushSize); + + // 恢复CompositingMode为默认值 + g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver; + } + else + { + // 绘制模式:获取当前选中的温差图例颜色 + Color selectedColor = Color.Black; // 默认颜色 + int selectedRowIndex = -1; + + // 尝试获取选中行的颜色 + if (dataGridViewTempDiff.SelectedRows.Count > 0) + { + selectedRowIndex = dataGridViewTempDiff.SelectedRows[0].Index; + } + else if (dataGridViewTempDiff.SelectedCells.Count > 0) + { + selectedRowIndex = dataGridViewTempDiff.SelectedCells[0].RowIndex; + } + + // 如果选中行索引有效,获取对应的颜色 + if (selectedRowIndex >= 0 && selectedRowIndex < tempDiffData.Count) + { + selectedColor = (Color)tempDiffData[selectedRowIndex]["color"]; + } + + // 计算考虑图像缩放比例的画笔大小 + 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像素 + } + + // 绘制区域(圆形) + int radius = adjustedBrushSize / 2; + using (SolidBrush brush = new SolidBrush(selectedColor)) + { + g.FillEllipse(brush, imagePoint.X - radius, imagePoint.Y - radius, adjustedBrushSize, adjustedBrushSize); + } + } + } + + // 刷新显示 + picBoxTemp.Invalidate(); + return; + } + + // 温差图绘制状态下的其他情况(非左键单击),不执行任何操作 if (_isTempDiffDrawingMode) { return;