1

と について学ん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か?

4

1 に答える 1

2

システムに完全な長方形以外を無効にすることはできません。

したがって、時間を節約するためにアウトライン パスを使用することはできません。

ただし、それは他のことに役立つ場合があります。2 つのオプションを見てみましょう。

  • アウトラインパスを作成できます
  • 地域の一部を除外できます

アウトラインを作成する最も簡単な方法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オブジェクトの をクリップし ますg:

g.SetClip(gp);

この後、 を含む描画はすべてClear、アウトライン内のピクセルにのみ影響します。

完了したら、次のように記述できます。

g.ResetClip();

グラフィックターゲットのフルサイズで描画を続けます。

または、パスを次のベースとして使用できますRegion

Region r = new Region(gp);

a をそれに制限Controlします..:

somecontrol.Region = r;

Regionsいくつかのセット操作をサポートしているため、上記のアウトライン パスを使用する代わりに、これを記述して同じ結果を得ることができます。

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