Рисование многоугольника на форме

Я хотел бы нарисовать многоугольник в форме, но я хотел бы добавить позиции многоугольника щелчком мыши.

Прямо сейчас я дал постоянные (x, y) позиции, и он возвращает мне многоугольник, но я хотел бы добавить эти позиции, щелкнув мышью.

 Point[] po = new Point[]
            {

                new Point {X=15, Y=51},
                new Point {X=40, Y= 13},
                new Point {X=87, Y= 53},
                new Point {X=56, Y= 87},
                new Point {X=44, Y= 32},
            };

person boris315    schedule 25.01.2017    source источник
comment
Есть много вопросов и источников, доступных для получения щелчков мышью. Что вы уже пробовали? Вы действительно пытались найти решение? Вы используете winforms или wpf?   -  person Ben    schedule 25.01.2017
comment
Вот пример кода, я думаю, это может вам помочь. stackoverflow.com/ вопросы/12108534/   -  person Tom Baires    schedule 25.01.2017
comment
я пытаюсь позволить пользователю рисовать многоугольник щелчком мыши, и я бы использовал его для определения интересующей области в форме @Ben   -  person boris315    schedule 25.01.2017
comment
Используйте MouseClick и соберите e.Locations в список‹Point›! Используйте событие Paint для e.Graphics.DrawPolygon(Pens.black, yourList.ToArray());   -  person TaW    schedule 25.01.2017
comment
@Tom: Эта ссылка собирает точки и рисует их в одном и том же событии (Paint). Здесь это ерунда, поскольку вопрос требует интерактивного решения. - Вместо этого первый переходит в MouseClick и рисует только в событии Paint.   -  person TaW    schedule 25.01.2017


Ответы (1)


создайте настраиваемый элемент управления для рисования многоугольника:

using System.Collections.ObjectModel;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication4
{
public partial class DrawPolygon : Control
{
    ObservableCollection<PointF> points;
    public int SideCount
    {
        get { return sideCount; }
        set { sideCount = value; }
    }

    public DrawPolygon()
    {
        InitializeComponent();
        points = new ObservableCollection<PointF>();
        points.CollectionChanged += Points_CollectionChanged;
    }

    private void Points_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
        if (points.Count >= sideCount)
            {
                points = new ObservableCollection<PointF>(points.Skip(points.Count - sideCount));
                points.CollectionChanged += Points_CollectionChanged;
            }
        Refresh();
    }
    protected override void OnMouseClick(MouseEventArgs e)
    {
        base.OnMouseClick(e);
        points.Add(e.Location);
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
        if (points.Count > 1)
            pe.Graphics.DrawPolygon(Pens.Aqua, points.ToArray());

    }
}

}

После сборки вы можете добавить его из панели инструментов в свою форму.

Это пример результата: Polygon

person Mohammad Roshani    schedule 25.01.2017
comment
Звучит как излишество и по-прежнему не позволяет перекрывать полигоны. Класс Polygon кажется более подходящим. - person TaW; 25.01.2017