Я бы предложил создать свой собственный элемент управления canvas ( [Edit: который наследует от PictureBox] ) с включенной двойной буферизацией. Это уменьшит мерцание при рисовании.
public partial class DrawingCanvas : PictureBox
{
public DrawingCanvas()
{
InitializeComponent();
SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw, true);
}
private Point start = new Point(0, 0);
private Point end = new Point(0, 0);
protected override void OnMouseDown(MouseEventArgs e)
{
start = e.Location;
end = e.Location;
Invalidate();
base.OnMouseDown(e);
}
protected override void OnMouseMove(MouseEventArgs e)
{
// This makes sure that the left mouse button is pressed.
if (e.Button == MouseButtons.Left)
end = e.Location;
Invalidate();
base.OnMouseMove(e);
}
protected override void OnPaint(PaintEventArgs e)
{
int top = start.Y < end.Y ? start.Y : end.Y;
int left = start.X < end.X ? start.X : end.X;
int width = end.X - start.X; if (width < 0) width = -width;
int height = end.Y - start.Y; if (height < 0) height = -height;
Rectangle rect = new Rectangle(left, top, width, height);
using (Pen pen = new Pen(Color.Red, 2))
{
e.Graphics.DrawRectangle(pen, rect);
}
}
}
Обратите внимание, что DrawRectangle
не принимает отрицательную ширину или высоту, поэтому вы должны позаботиться об этом в методе OnPaint
.
Как только вы добавите этот элемент управления в свой проект, скомпилируйте проект. Ваш пользовательский элемент управления должен быть доступен в верхней части окна панели инструментов в Visual Studio. Если это не так, вы можете либо щелкнуть правой кнопкой мыши на панели инструментов и выбрать Choose Items...
, чтобы добавить свой холст на панель инструментов, либо просто добавить элемент управления Panel
к своему Form
, открыть файл Form.Designer.cs
и заменить все Panel
ссылки с вашим DrawingCanvas
(или любым другим именем по вашему выбору).
При настройке фонового изображения используйте свойство BackgroundImage
.