Создайте в форме элемент управления 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, поэтому имейте в виду, что ваша идея просто создать дочерние элементы управления, которые выполняют рисование, также действительна и может даже будет удобнее, если вы захотите щелкнуть по ним и тому подобное.