Прокручиваемые линии / прямоугольники / эллипсы на панели - PullRequest
0 голосов
/ 05 мая 2020

У меня есть серия прямоугольников / линий / эллипсов через g.FillRectangle и c на панели, которые рисуются при нажатии кнопки (не при создании формы). Я хотел бы, чтобы эта «форма» прокручивалась по вертикали и горизонтали, потому что количество прямоугольников и размеры этой формы варьируются в зависимости от некоторых параметров, поэтому я могу «исследовать» всю «фигуру».

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

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Создайте в форме элемент управления Panel под названием panel1, это будет видимая часть вашего контента. Установите для свойства AutoScroll panel1 значение true .

Внутри panel1 добавьте элемент управления PictureBox с именем pictureBox1, это будет большое содержимое вашего изображения.

Добавьте обработчик pictureBox1 Paint для рисования фигур внутри PictureBox.

Не забудьте установить местоположение pictureBox1 на 0,0 и установить его размер в соответствии с размером вашего содержимого .

Редактировать: Пример кода чертежа

Чтобы использовать этот пример, вам нужно вручную добавить Form с именем Form1. Затем в дизайнере вы:

  • добавите Panel и PictureBox, как описано выше.
  • добавите обработчик Paint и MouseDown обработчик к PictureBox.
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    List<Point> dots = new List<Point>();

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        e.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        const int radius = 4;
        int N = dots.Count;
        if (N == 0) {
            e.Graphics.DrawString("Click to add a dot", this.Font, Brushes.Black, radius, radius);
        }
        for( int i = 0; i < dots.Count; ++i) {
            var dot = dots[i];
            e.Graphics.FillEllipse(Brushes.Black, new Rectangle(dot.X - radius, dot.Y - radius, radius * 2, radius * 2));
            e.Graphics.DrawString(i.ToString(), this.Font, Brushes.Black, dot.X + radius, dot.Y + radius);
        }
    }

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        dots.Add(e.Location);
        pictureBox1.Invalidate();
    }
}

Обратите внимание, что я храню список точек , который реализован как поле формы с именем dots, которое является List<Point>. Здесь вы можете отслеживать гораздо больше данных и учитывать различные формы, больше метаданных и т. Д. c. Обработчик Paint PictureBox выполняет итерацию по всем точкам (которые представляют все ваши записи фигур ) и выдает команды рисования для рисования каждой из них. В этом примере я заполняю эллипс и аннотирую его строкой. Я также добавил обработчик кликов, чтобы вы могли добавлять точки, нажимая. Это обновит список dots. Платформа не знает, что обновления списка dots должны вызывать изменения визуальных элементов в окне, поэтому, когда вы обновляете список, вы должны вызвать Invalidate на PictureBox, чтобы заставить его перерисовать снова с новыми данными списка (новые записи формы в вашем случае).

List<Point> можно легко увеличить до List<Shape> с помощью polymorphi c Shape класса вашего собственный дизайн с переопределяемыми методами рисования.

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

0 голосов
/ 09 мая 2020

Мне удалось найти работоспособное решение, используя окно с картинками на панели, а затем используя растровый объект, который обеспечивает большую гибкость, и я могу обращаться к ним из любого места sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...