我正在创建一个图像查看器的应用程序。我在Windows上使用.Net
在我的应用中,我试图在拖动时突出显示特定区域。 我创建了一个Rectangle。
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();
}
我的代码直到这一点工作正常。 现在我想使INVERSE拖动区域(拖动区域之外的区域)变暗,我的意思是拖动时应该突出显示此Rectangle内的区域。
知道如何继续。
感谢。
-Pankaj
答案 0 :(得分:4)
我想你可以通过创建覆盖矩形外部的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
控件并使用它而无需其他代码
您也可以考虑更改突出显示区域的行为,因此鼠标光标位于其中心。我想这对用户来说会更直观。
如果您对代码有任何问题,请将其写在评论中,我会尽力帮助:)。