将 Rectangle 的路径转换为 ​​GraphicPath/Region

Converting the path of a Rectangle into a GraphicPath/Region

我正在了解 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();
}

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

除了一个完整的矩形,您无法让系统使任何东西无效。

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

不过它对其他事情也很有用。让我们看看两个选项:

  • 您可以创建大纲路径
  • 您可以排除某个地区的部分地区

创建大纲 GraphicsPath 的最简单方法是 加宽 给定路径 Pen:

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

这让您可以使用 Pen 的所有选项,包括 DashStylesAlignmentLineJoins 等。

另一种方法是使用默认 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);

或者用它来剪辑 Graphics 对象的 ClipBounds g :

g.SetClip(gp);

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

完成后你可以写:

g.ResetClip();

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

或者您可以使用路径作为 Region:

的基础
Region r = new Region(gp);

并限制 Control 到它..:[=​​32=]

somecontrol.Region = r;

Regions 支持多个 set 操作 所以除了使用上面的大纲路径你也可以写出相同的结果:

Region r = new Region(r0);
r.Exclude(r1);