gpt4 book ai didi

c# - 拖动时突出显示矩形区域

转载 作者:行者123 更新时间:2023-11-30 15:39:39 28 4
gpt4 key购买 nike

我正在创建一个图像查看器类型的应用程序。我在 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 控件从工具箱中拖出,无需额外代码即可使用它

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

如果您对代码有任何问题,请将其写在评论中,我会尽力提供帮助:)。

关于c# - 拖动时突出显示矩形区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10091356/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com