支持温差图绘制状态下的单击绘制和擦除功能
This commit is contained in:
@@ -2746,11 +2746,113 @@ namespace JoyD.Windows.CS
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 鼠标点击事件 - 处理区域选中和右击退出选中状态
|
/// 鼠标点击事件 - 处理区域选中、右击退出选中状态,以及温差图绘制状态下的单击绘制和擦除
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void PicBoxTemp_MouseClick(object sender, MouseEventArgs e)
|
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)
|
if (_isTempDiffDrawingMode)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user