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;