拖动矩形区域时突出显示它
本文关键字:显示 区域 拖动 | 更新日期: 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
控件并使用它,而无需其他代码
您还可以考虑更改突出显示区域的行为,以便鼠标光标位于其中心。我想这对用户来说会更直观。
如果您对代码有任何问题,只需将其写在注释中,我会尽力帮助:)。