diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs
index 148f527..8e19dcf 100644
--- a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs
+++ b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs
@@ -32,6 +32,8 @@ namespace JoyD.Windows.CS
// 叠加层图像 - 用于存储已完成绘制的矩形
private Image _rectangleOverlayImage = null;
private int _hoveredRegionIndex = -1; // 当前悬停的区域索引(-1表示没有悬停在任何区域上)
+ // 当前选中的区域索引
+ private int _selectedRegionIndex = -1;
public Setting()
{
@@ -55,6 +57,9 @@ namespace JoyD.Windows.CS
btnDrawRegion.Click += BtnDrawRegion_Click;
btnSelectColor.Click += BtnSelectColor_Click;
+ // 注册鼠标事件
+ picBoxTemp.MouseClick += PicBoxTemp_MouseClick;
+
// 初始隐藏颜色选择按钮,只有在绘制模式下才显示
btnSelectColor.Visible = false;
}
@@ -381,6 +386,7 @@ namespace JoyD.Windows.CS
/// 绘制事件 - 显示矩形框(实现图像合并机制)
/// 处理叠加层图像的缩放,确保与控件尺寸匹配
/// 实现鼠标悬停区域填充半透明色功能
+ /// 实现选中区域显示八个句柄功能
///
private void PicBoxTemp_Paint(object sender, PaintEventArgs e)
{
@@ -397,8 +403,31 @@ namespace JoyD.Windows.CS
e.Graphics.DrawImage(_rectangleOverlayImage, destRect, 0, 0, _rectangleOverlayImage.Width, _rectangleOverlayImage.Height, GraphicsUnit.Pixel);
}
- // 绘制悬停区域的半透明填充(就绪状态)
- if (!_isDrawingMode && _hoveredRegionIndex != -1)
+ // 绘制选中区域的半透明填充和八个句柄
+ if (!_isDrawingMode && _selectedRegionIndex != -1)
+ {
+ // 查找当前选中的区域
+ RegionInfo selectedRegion = _drawnRectangles.FirstOrDefault(r => r.Index == _selectedRegionIndex);
+ if (selectedRegion != null)
+ {
+ // 将图像坐标转换为控件坐标
+ Rectangle controlRectangle = ImageRectangleToControlRectangle(selectedRegion.ImageRectangle);
+
+ // 创建半透明的填充颜色(使用区域的颜色,但设置透明度)
+ Color semiTransparentColor = Color.FromArgb(100, selectedRegion.Color);
+
+ // 填充半透明矩形
+ using (SolidBrush brush = new SolidBrush(semiTransparentColor))
+ {
+ e.Graphics.FillRectangle(brush, controlRectangle);
+ }
+
+ // 绘制八个句柄
+ DrawHandles(e.Graphics, controlRectangle);
+ }
+ }
+ // 绘制悬停区域的半透明填充(就绪状态且没有选中区域时)
+ else if (!_isDrawingMode && _hoveredRegionIndex != -1 && _selectedRegionIndex == -1)
{
// 查找当前悬停的区域
RegionInfo hoveredRegion = _drawnRectangles.FirstOrDefault(r => r.Index == _hoveredRegionIndex);
@@ -570,6 +599,96 @@ namespace JoyD.Windows.CS
///
/// 定时器每秒触发的事件处理方法
///
+ ///
+ /// 绘制矩形的八个句柄
+ ///
+ /// 绘图对象
+ /// 要绘制句柄的矩形(控件坐标)
+ private void DrawHandles(Graphics g, Rectangle rectangle)
+ {
+ // 句柄大小
+ int handleSize = 6;
+
+ // 句柄颜色
+ Color handleColor = Color.White;
+ Color handleBorderColor = Color.Black;
+
+ // 八个句柄的位置
+ Point[] handlePoints = new Point[]
+ {
+ // 左上角
+ new Point(rectangle.Left, rectangle.Top),
+ // 上中
+ new Point(rectangle.Left + rectangle.Width / 2, rectangle.Top),
+ // 右上角
+ new Point(rectangle.Right, rectangle.Top),
+ // 右中
+ new Point(rectangle.Right, rectangle.Top + rectangle.Height / 2),
+ // 右下角
+ new Point(rectangle.Right, rectangle.Bottom),
+ // 下中
+ new Point(rectangle.Left + rectangle.Width / 2, rectangle.Bottom),
+ // 左下角
+ new Point(rectangle.Left, rectangle.Bottom),
+ // 左中
+ new Point(rectangle.Left, rectangle.Top + rectangle.Height / 2)
+ };
+
+ // 绘制每个句柄
+ using (SolidBrush handleBrush = new SolidBrush(handleColor))
+ using (Pen handleBorderPen = new Pen(handleBorderColor, 1))
+ {
+ foreach (Point point in handlePoints)
+ {
+ // 计算句柄矩形
+ Rectangle handleRect = new Rectangle(
+ point.X - handleSize / 2,
+ point.Y - handleSize / 2,
+ handleSize,
+ handleSize);
+
+ // 绘制句柄(白色填充,黑色边框)
+ g.FillRectangle(handleBrush, handleRect);
+ g.DrawRectangle(handleBorderPen, handleRect);
+ }
+ }
+ }
+
+ ///
+ /// 鼠标点击事件 - 处理区域选中
+ ///
+ private void PicBoxTemp_MouseClick(object sender, MouseEventArgs e)
+ {
+ // 仅在就绪状态(非绘制模式)下处理
+ if (!_isDrawingMode && e.Button == MouseButtons.Left && picBoxTemp.Image != null)
+ {
+ // 将控件坐标转换为图像坐标
+ Point imagePoint = ControlPointToImagePoint(e.Location);
+
+ // 检查是否点击在某个区域内
+ bool clickedOnRegion = false;
+ foreach (RegionInfo region in _drawnRectangles)
+ {
+ if (region.ImageRectangle.Contains(imagePoint))
+ {
+ // 选中或取消选中该区域
+ _selectedRegionIndex = (_selectedRegionIndex == region.Index) ? -1 : region.Index;
+ clickedOnRegion = true;
+ break;
+ }
+ }
+
+ // 如果没有点击在任何区域上,取消选中
+ if (!clickedOnRegion)
+ {
+ _selectedRegionIndex = -1;
+ }
+
+ // 刷新绘制
+ picBoxTemp.Invalidate();
+ }
+ }
+
///
/// 当图像更新或控件大小变化时,重新创建叠加层图像
/// 确保矩形框正确显示在新的尺寸下