支持温差图绘制状态下的单击绘制和擦除功能

This commit is contained in:
zqm
2025-11-11 10:13:11 +08:00
parent 6adf47ac2a
commit 28a9846da6

View File

@@ -2746,11 +2746,113 @@ namespace JoyD.Windows.CS
}
/// <summary>
/// 鼠标点击事件 - 处理区域选中右击退出选中状态
/// 鼠标点击事件 - 处理区域选中右击退出选中状态,以及温差图绘制状态下的单击绘制和擦除
/// </summary>
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;