支持温差图绘制状态下的单击绘制和擦除功能
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user