将 Rectangle 的路径转换为 GraphicPath/Region
Converting the path of a Rectangle into a GraphicPath/Region
我正在了解 GraphicsPath
和 Region
。并将其与 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
的所有选项,包括 DashStyles
、Alignment
、LineJoins
等。
另一种方法是使用默认 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);
我正在了解 GraphicsPath
和 Region
。并将其与 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
的所有选项,包括 DashStyles
、Alignment
、LineJoins
等。
另一种方法是使用默认 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);