1

我正在学习GraphicsPathRegion。并将其与Invalidate.

所以,我有一个Rectangle对象,我想擦除这个矩形。但是,我只想擦除矩形的边缘(即线条)。

目前我有这个:

if(bErase)
{
    Rectangle rcRubberBand = GetSelectionRectangle();

    GraphicsPath path = new GraphicsPath();
    path.AddRectangle(rcLastRubberBand);
    Region reg = new Region(path);
    myControl3.Invalidate(reg);
    myControl3.Update();
}

它有效,但它使完整的矩形形状无效。我只需要使我绘制的矩形线无效。我可以用 做这样的路径GraphicsPath吗?

4

1 回答 1

2

除了完整的矩形之外,您无法让系统使任何内容无效。

所以你不能使用大纲路径来节省时间。

但是,它可能对其他事情有用。让我们看两个选项:

  • 您可以创建大纲路径
  • 您可以排除区域的一部分

创建轮廓的最简单方法GraphicsPath是使用加宽给定路径Pen

GraphicsPath gp = new GraphicsPath();
gp.AddRectangle(r0);
using (Pen pen = new Pen(Color.Green, 3f)) gp.Widen(pen); 

这让您可以使用 a 的所有许多选项Pen,包括DashStyles,AlignmentLineJoins

另一种方法是使用默认值创建它FillMode.Alternate并简单地添加一个较小的图形:

Rectangle r0 = new Rectangle(11, 11, 333, 333);
Rectangle r1 = r0;
r1.Inflate(-6, -6);
GraphicsPath gp = new GraphicsPath();
gp.AddRectangle(r0);
gp.AddRectangle(r1);

现在你可以填充路径

g.FillPath(Brushes.Red, gp);

ClipBounds或使用它来剪辑 Graphics对象g

g.SetClip(gp);

在此之后,您绘制的任何内容(包括 a Clear)都只会影响轮廓内的像素。

完成后,您可以编写:

g.ResetClip();

并继续在图形目标的全尺寸上绘图。

或者,您可以使用路径作为 a 的基础Region

Region r = new Region(gp);

并限制Control它..:

somecontrol.Region = r;

Regions支持多个集合操作,因此您也可以使用相同的结果编写它,而不是使用上面的大纲路径:

Region r = new Region(r0);
r.Exclude(r1);
于 2016-06-03T21:46:42.573 回答