diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs index 3d5b02c..4fff4f1 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs @@ -34,6 +34,8 @@ namespace JoyD.Windows.CS private int _regionCounter = 0; // 叠加层图像 - 用于存储已完成绘制的矩形 private Image _rectangleOverlayImage = null; + // 温差层图像 - 用于存储温差图绘制内容 + private Image _tempDiffOverlayImage = null; private int _hoveredRegionIndex = -1; // 当前悬停的区域索引(-1表示没有悬停在任何区域上) // 当前选中的区域索引 private int _selectedRegionIndex = -1; @@ -51,6 +53,8 @@ namespace JoyD.Windows.CS // 画笔大小相关变量 private int _currentBrushSize = 1; // 默认画笔大小为1像素 + // 温差图绘制相关变量 + private Point _lastDrawPoint = Point.Empty; // 上一个绘制点的位置 public Setting() { @@ -617,6 +621,8 @@ namespace JoyD.Windows.CS // 刷新绘制 picBoxTemp.Invalidate(); + + } // 处理选中区域的调整大小或移动 else if (e.Button == MouseButtons.Left && !_isDrawingMode && _selectedRegionIndex != -1) @@ -861,15 +867,35 @@ namespace JoyD.Windows.CS /// private void ExitTempDiffDrawingMode() { + // 重置上一个绘制点 + _lastDrawPoint = Point.Empty; _isTempDiffDrawingMode = false; btnDrawTempDiff.Checked = false; - // 重置鼠标光标并释放自定义光标资源 - if (picBoxTemp.Cursor != Cursors.Default) + // 重置鼠标光标并安全释放自定义光标资源 + try { - Cursor oldCursor = picBoxTemp.Cursor; + Cursor currentCursor = picBoxTemp.Cursor; + // 只释放自定义光标,不释放系统光标 + if (currentCursor != null && currentCursor != Cursors.Default && + currentCursor != Cursors.Cross && currentCursor != Cursors.Hand && + currentCursor != Cursors.IBeam && currentCursor != Cursors.WaitCursor) + { + // 先设置新光标,再释放旧光标 + picBoxTemp.Cursor = Cursors.Default; + currentCursor.Dispose(); + } + else if (currentCursor != Cursors.Default) + { + // 如果是系统光标,直接设置为默认光标 + picBoxTemp.Cursor = Cursors.Default; + } + } + catch (Exception ex) + { + Console.WriteLine("重置光标资源时发生异常: " + ex.Message); + // 确保光标设置为默认值 picBoxTemp.Cursor = Cursors.Default; - oldCursor.Dispose(); // 释放自定义光标资源 } // 更新按钮提示文本 @@ -1126,22 +1152,94 @@ namespace JoyD.Windows.CS selectedColor = (Color)tempDiffData[selectedRowIndex]["color"]; } - // 创建并设置自定义光标 - Cursor customCursor = CreateCustomBrushCursor(_currentBrushSize, selectedColor); - - // 确保不重复设置相同的光标(避免资源泄漏) - if (picBoxTemp.Cursor != customCursor) + try { - // 释放旧光标资源 - picBoxTemp.Cursor.Dispose(); - picBoxTemp.Cursor = customCursor; + // 创建并设置自定义光标 + Cursor customCursor = CreateCustomBrushCursor(_currentBrushSize, selectedColor); + + // 确保不重复设置相同的光标(避免资源泄漏) + if (picBoxTemp.Cursor != customCursor) + { + // 获取旧光标 + Cursor oldCursor = picBoxTemp.Cursor; + + // 先设置新光标 + picBoxTemp.Cursor = customCursor; + + // 只释放自定义光标,不释放系统光标 + if (oldCursor != null && oldCursor != Cursors.Default && + oldCursor != Cursors.Cross && oldCursor != Cursors.Hand && + oldCursor != Cursors.IBeam && oldCursor != Cursors.WaitCursor) + { + oldCursor.Dispose(); + } + } + } + catch (Exception ex) + { + Console.WriteLine("设置自定义光标时发生异常: " + ex.Message); + // 出现异常时设置为十字光标 + try + { + if (picBoxTemp.Cursor != Cursors.Cross) + { + picBoxTemp.Cursor = Cursors.Cross; + } + } + catch {} } - // 如果按下鼠标左键,执行绘制操作(这里可能需要根据实际绘制逻辑补充) - if (e.Button == MouseButtons.Left) + // 如果按下鼠标左键,执行绘制操作 + if (e.Button == MouseButtons.Left && picBoxTemp.Image != null) { - // 这里可以添加实际的绘制逻辑 - // 目前仅设置光标,具体绘制代码可能在其他事件中 + // 初始化温差层图像(如果不存在或尺寸不匹配) + 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.AntiAlias; + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + + // 使用当前选中的颜色和画笔大小绘制 + using (Pen pen = new Pen(selectedColor, _currentBrushSize)) + { + pen.StartCap = LineCap.Round; + pen.EndCap = LineCap.Round; + pen.LineJoin = LineJoin.Round; + + // 如果是首次绘制或上一个点无效,记录当前点作为起点 + if (_lastDrawPoint == Point.Empty) + { + _lastDrawPoint = imagePoint; + // 绘制起始点的圆形 + int radius = _currentBrushSize / 2; + g.FillEllipse(new SolidBrush(selectedColor), + imagePoint.X - radius, + imagePoint.Y - radius, + _currentBrushSize, + _currentBrushSize); + } + else + { + // 绘制连线 + g.DrawLine(pen, _lastDrawPoint, imagePoint); + // 更新上一个点 + _lastDrawPoint = imagePoint; + } + } + } + + // 触发重绘 + picBoxTemp.Invalidate(); } return; // 温差图绘制模式下,不执行其他鼠标移动逻辑 @@ -1354,6 +1452,32 @@ namespace JoyD.Windows.CS } } + /// + /// 初始化温差层图像 + /// 创建与原图大小相同的透明图像用于温差绘制 + /// + private void InitializeTempDiffOverlayImage() + { + if (picBoxTemp.Image == null || picBoxTemp.Image.Width == 0 || picBoxTemp.Image.Height == 0) + return; + + // 释放旧的温差层图像资源 + if (_tempDiffOverlayImage != null) + { + _tempDiffOverlayImage.Dispose(); + _tempDiffOverlayImage = null; + } + + // 创建新的温差层图像 + _tempDiffOverlayImage = new Bitmap(picBoxTemp.Image.Width, picBoxTemp.Image.Height); + + // 清除背景为透明 + using (Graphics g = Graphics.FromImage(_tempDiffOverlayImage)) + { + g.Clear(Color.Transparent); + } + } + /// /// 将单个区域绘制到叠加层图像 /// 用于增量绘制,避免每次都重绘所有矩形 @@ -1370,8 +1494,8 @@ namespace JoyD.Windows.CS // 设置高质量绘图 g.SmoothingMode = SmoothingMode.AntiAlias; - // 使用每个区域自己的颜色和当前选择的画笔大小绘制矩形 - g.DrawRectangle(new Pen(region.Color, _currentBrushSize), region.ImageRectangle); + // 使用每个区域自己的颜色和固定线条粗细绘制矩形 + g.DrawRectangle(new Pen(region.Color, 2), region.ImageRectangle); // 绘制区域序号 using (Font font = new Font("Arial", 12, FontStyle.Bold)) @@ -1395,6 +1519,12 @@ namespace JoyD.Windows.CS /// private void PicBoxTemp_MouseUp(object sender, MouseEventArgs e) { + // 在温差图绘制模式下,松开鼠标时重置上一个绘制点 + if (_isTempDiffDrawingMode) + { + _lastDrawPoint = Point.Empty; + } + // 结束调整大小 if (_isResizing && e.Button == MouseButtons.Left) { @@ -1491,7 +1621,17 @@ namespace JoyD.Windows.CS e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; - // 图像合并机制:先绘制叠加层(根据控件尺寸进行缩放) + // 图像合并机制: + // 1. 先绘制温差层(根据控件尺寸进行缩放) + if (_tempDiffOverlayImage != null && picBoxTemp.Image != null) + { + // 计算缩放后的目标矩形 + Rectangle destRect = new Rectangle(0, 0, picBoxTemp.ClientSize.Width, picBoxTemp.ClientSize.Height); + // 绘制缩放后的温差层 + e.Graphics.DrawImage(_tempDiffOverlayImage, destRect, 0, 0, _tempDiffOverlayImage.Width, _tempDiffOverlayImage.Height, GraphicsUnit.Pixel); + } + + // 2. 然后绘制叠加层(根据控件尺寸进行缩放) if (_rectangleOverlayImage != null && picBoxTemp.Image != null) { // 计算缩放后的目标矩形 @@ -1847,6 +1987,13 @@ namespace JoyD.Windows.CS _rectangleOverlayImage.Dispose(); _rectangleOverlayImage = null; } + + // 释放温差层图像资源 + if (_tempDiffOverlayImage != null) + { + _tempDiffOverlayImage.Dispose(); + _tempDiffOverlayImage = null; + } } /// @@ -2116,6 +2263,15 @@ namespace JoyD.Windows.CS /// private void UpdateOverlayForSizeChange() { + // 处理温差层图像尺寸变化 + if (picBoxTemp.Image != null && _tempDiffOverlayImage != null && ( + _tempDiffOverlayImage.Width != picBoxTemp.Image.Width || + _tempDiffOverlayImage.Height != picBoxTemp.Image.Height)) + { + InitializeTempDiffOverlayImage(); + } + + // 处理矩形叠加层图像 if (picBoxTemp.Image != null && _drawnRectangles.Count > 0) { CreateRectangleOverlayImage();