拖动矩形区域时突出显示它

本文关键字:显示 区域 拖动 | 更新日期: 2023-09-27 18:30:32

我正在创建一个图像查看器类型的应用程序。我在Windows上并使用.Net

在我的应用程序中,我试图在拖动时突出显示特定区域。我创建了一个矩形。

Rectangle areaRect = new Rectangle(100,100, 300, 300);
Point ptOld = new Point(0, 0);
Pen rectPen = new Pen(Brushes.White, 3);
protected override void OnPaint(PaintEventArgs e)
{
  Graphics dcPaint = e.Graphics;
  dcPaint.DrawRectangle(rectPen, areaRect);
}

现在,我正在拖动此矩形区域以及鼠标移动。

protected override void OnMouseMove(MouseEventArgs e)
{
 Point ptNew = new Point(e.X, e.Y);
 int dx = ptNew.X - ptOld.X;
 int dy = ptNew.Y - ptOld.Y;
 areaRect.Offset(dx, dy);
 MoveRect(ptNew);
 ptOld = ptNew;
}

在这里,我正在尝试用鼠标移动此矩形

void MoveRect(Point point)
{
 Graphics grfxClient = CreateGraphics();
 Rectangle tempRectangle = new Rectangle(areaRect.Left, areaRect.Top, areaRect.Width,   areaRect.Height);
 grfxClient.DrawRectangle(rectPen, tempRectangle);
 this.Invalidate();
 grfxClient.Dispose();
}

到目前为止,我的代码工作正常。现在我想使反向拖动区域(拖动区域之外的区域)变暗,我的意思是拖动时应突出显示此矩形内的区域。

任何知道如何进行。

谢谢。

-潘卡伊

拖动矩形区域时突出显示它

我想你可以通过创建一个覆盖矩形外部的Region对象并用半透明的SolidBrush填充它以使其看起来变暗来做到这一点。

您也不必创建图形并在事件中绘制OnMouseMove只需移动矩形并使正在绘制的控件的表面无效即可。

我使用的代码看起来或多或少是这样的:

Rectangle areaRect = new Rectangle(100,100, 300, 300);
Point ptOld = new Point(0, 0);
Pen rectPen = new Pen(Brushes.White, 3);
//A new field with a semi-transparent brush to paint the outside of the rectangle
Brush dimmingBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 0));
protected override void OnPaint(PaintEventArgs e)
{
    Region outsideRegion = new System.Drawing.Region(e.ClipRectangle);
    outsideRegion.Exclude(areaRect);
    Graphics dcPaint = e.Graphics;
    dcPaint.FillRegion(dimmingBrush, outsideRegion);
    dcPaint.DrawRectangle(rectPen, areaRect);
}
protected override void OnMouseMove(MouseEventArgs e)
{
    Point ptNew = new Point(e.X, e.Y);
    int dx = ptNew.X - ptOld.X;
    int dy = ptNew.Y - ptOld.Y;
    areaRect.Offset(dx, dy);
    ptOld = ptNew;
    this.Invalidate();
}

不需要名为 MoveRect 的方法。

它现在似乎可以按照您的要求工作。

建议

我也有一些建议。您不必使用它们,也许它们会对您有所帮助。

您尚未编写用于绘制的控件类型(或重写Form方法并直接在其上绘制),但我建议您使用 PictureBox 控件,创建从它派生的自定义控件并重写其事件。这应该使绘画过程顺利并防止闪烁。要这样做:

  • 通过选择"添加"和"用户控件..."来创建新的用户控件,并命名一个新控件,MyPictureBox
  • 更改控件的父类,因此它现在应包含以下行:

    public partial class MyPictureBox : PictureBox
    
  • 打开文件 MyPictureBox.Designer.cs并注释掉以下行:

    //this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    //this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    
  • 复制我在此答案中发布的代码,并添加行base.OnPaint(e);OnPaint方法的开头

  • 编译项目

  • 现在,您应该能够打开主窗体的设计器,从工具箱中拖动MyPictureBox控件并使用它,而无需其他代码

您还可以考虑更改突出显示区域的行为,以便鼠标光标位于其中心。我想这对用户来说会更直观。

如果您对代码有任何问题,只需将其写在注释中,我会尽力帮助:)。