3

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

到目前为止,我的代码运行良好。现在我想使反向拖动区域变暗(拖动区域之外的区域),我的意思是这个矩形内的区域应该在拖动时突出显示。

任何想法如何进行。

谢谢。

-潘卡伊

4

1 回答 1

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控件,创建一个从它派生的自定义控件并覆盖它的事件。这应该使绘画过程顺利并防止闪烁。这样做:

  • 通过选择Add and User Control...创建一个新的用户控件并命名一个新控件,即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从工具箱中拖动控件并使用它,而无需额外的代码

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

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

于 2012-04-10T16:40:02.487 回答