我正在了解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();
}
它有效,但它使整个矩形形状无效。我只需要使我绘制的矩形线无效。我可以使用GraphicsPath
制作这样的路径吗?
答案 0 :(得分:1)
除了完整的矩形外,您无法使系统无效。
因此,您无法使用轮廓路径来节省时间。
然而,它可能对其他事情有用。我们来看两个选项:
创建大纲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);
或用它来剪辑ClipBounds
对象Graphics
的{{1}}:
g
在此之后,您绘制的任何内容(包括g.SetClip(gp);
)都只会影响轮廓内的像素。
完成后你可以写:
Clear
并继续绘制图形目标的完整大小。
或者您可以将路径用作g.ResetClip();
的基础:
Region
并限制Region r = new Region(gp);
到它..:
Control
somecontrol.Region = r;
支持多个设置操作,因此您可以使用相同的结果编写此代码,而不是使用上面的大纲路径:
Regions