Графика FillPolygon экстерьера? - PullRequest
1 голос
/ 31 января 2011

Я создал простое тестовое приложение, которое будет рисовать многоугольник на изображении с учетом заданных точек. Я создал кисть, которая будет заполнять многоугольник так, как я хочу. Теперь я хочу заполнить все, но многоугольник. Итак, используя мою кисть, я хочу нарисовать вокруг многоугольника, чтобы все, что видно, было внутри полигона. Кто-нибудь знает, как я могу это сделать?

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 17 марта 2011

Я был удивлен, что нигде не нашел этот ответ, но, глядя на документацию по System.Drawing.Region , ответ казался очень простым.

Мы можем исключить полигон (который, как я предполагаю, должен быть GraphicsPath), из бесконечной области.Region.XOR должен работать так же, как и Exclude в этом случае:

            Region region = new Region();
            region.MakeInfinite();
            GraphicsPath polygonPath = GetYourPolygon();
            region.Exclude(polygonPath);
            e.Graphics.FillRegion(Brushes.Black, region);

В моем случае мне просто нужно было исключить простой RectangleF, но это помогло, он заполнил окружающую область и оставил исключенную область одной.

1 голос
/ 01 февраля 2011

Я думаю, что System.Drawing.Graphics.Clip - это то, что вы хотите.

Вот пример кода по этой ссылке:

Private Sub SetAndFillClip(ByVal e As PaintEventArgs)

    ' Set the Clip property to a new region.
    e.Graphics.Clip = New Region(New Rectangle(10, 10, 100, 200))

    ' Fill the region.
    e.Graphics.FillRegion(Brushes.LightSalmon, e.Graphics.Clip)

    ' Demonstrate the clip region by drawing a string
    ' at the outer edge of the region.
    e.Graphics.DrawString("Outside of Clip", _
        New Font("Arial", 12.0F, FontStyle.Regular), _
        Brushes.Black, 0.0F, 0.0F)

End Sub

Чтобы заполнить все, что находится за пределами области, вам нужно будет определить экстенты DC, в который вы рисуете, и затем заполнить этот прямоугольник после того, как установите Graphics.Clip в область, созданную из ваших точек.

Итак, ваш код может выглядеть примерно так:

Private Sub SetAndFillClip(ByVal e As PaintEventArgs)

    ' Set the Clip property to a new region.
    e.Graphics.Clip = GetRegionFromYourPoints()

    ' Fill the entire client area, clipping to the Clip region
    e.Graphics.FillRectangle(Brushes.LightSalmon, GetWindowExtentsFromYourWindow())
End Sub

Эта ссылка показывает, как создать регион из массива точек:

http://www.vb -helper.com / howto_net_control_region.html

0 голосов
/ 05 апреля 2017

Те, кто еще не нашел решения, взглянули на this .Работал на меня, из коробки.Выполните следующие действия:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    var points = new []
    {              
        new PointF(150, 250),
        new PointF( 50, 500),
        new PointF(250, 400),
        new PointF(300, 100),
        new PointF(500, 500),
        new PointF(500,  50),
    };

    using (var path = new GraphicsPath())
    {
        path.AddPolygon(points);

        // Uncomment this to invert:
        // p.AddRectangle(this.ClientRectangle);

        using (var brush = new SolidBrush(Color.Black))
        {
            e.Graphics.FillPath(brush, path);
        }
    }
}

A similar output will be like this

...