将Rectangle的路径转换为GraphicPath / Region

时间:2016-06-03 20:28:47

标签: c# region graphicspath

我正在了解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制作这样的路径吗?

1 个答案:

答案 0 :(得分:1)

除了完整的矩形外,您无法使系统无效。

因此,您无法使用轮廓路径来节省时间。

然而,它可能对其他事情有用。我们来看两个选项:

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

创建大纲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);

或用它来剪辑ClipBounds对象Graphics的{​​{1}}:

g

在此之后,您绘制的任何内容(包括g.SetClip(gp); )都只会影响轮廓内的像素。

完成后你可以写:

Clear

并继续绘制图形目标的完整大小。

或者您可以将路径用作g.ResetClip(); 的基础:

Region

并限制Region r = new Region(gp); 到它..:

Control

somecontrol.Region = r; 支持多个设置操作,因此您可以使用相同的结果编写此代码,而不是使用上面的大纲路径:

Regions