拖动时突出显示矩形区域

时间:2012-04-10 15:10:00

标签: c# gdi

我正在创建一个图像查看器的应用程序。我在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

1 个答案:

答案 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控件并使用它而无需其他代码

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

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