Когда мы рисуем элемент управления и хотим, чтобы рисунок сохранялся, нам нужно подписаться на событие Paint () этого элемента управления.Или, если это пользовательский элемент управления (пользовательский класс, производный от существующего объекта), переопределить его OnPaint () метод.
Контроллер домена перерисовывается довольно часто.Когда другое окно перемещается над ним, когда его контейнер Form
свернут / развернут или изменен, если это касается видимой области элемента управления и т. Д.
Когда требуется перерисовка, Paint()
событие вызывается.
Чертеж будет сохранен, только если он закодирован внутри обработчика события Paint()
(или метода OnPaint()
).
Также важно заметить, что большая часть используемого объекта реализует IDisposable()
.
Все они должны быть Disposed()
.Здесь объект GraphicsPath
и чертеж Pen
.
Region
, примененный к PicturBox
, также должен быть удален.Он может быть объявлен в области видимости класса и ликвидирован после закрытия Form
.
Пример, использующий (более или менее) те же настройки, что и в вопросе.
A
Form
, содержащий
PictureBox
и 2
Buttons
:
При нажатии
Button1
будет создан эллиптический
Region
для
PictureBox
.
Button2
будет
Invalidate()
PictureBox
, в результате чего перекраска будет
запланирована .Событие
Paint()
будет вызвано.
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
bool PaintBorder = false;
int RegionInSet = 8;
private void button1_Click(object sender, EventArgs e)
{
using (GraphicsPath path = new GraphicsPath())
{
path.AddEllipse(RegionInSet, RegionInSet, pictureBox1.Width - (RegionInSet * 2),
pictureBox1.Height - (RegionInSet * 2));
Region region = new Region(path);
pictureBox1.Region = region;
}
}
private void button2_Click(object sender, EventArgs e)
{
PaintBorder = true;
pictureBox1.Invalidate();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (!PaintBorder) return;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.CompositingMode = CompositingMode.SourceOver;
e.Graphics.PixelOffsetMode = PixelOffsetMode.Half;
using (Pen penRed = new Pen(Color.Red, 12))
{
int PenRedOffset = (int)(penRed.Width / 2) + (penRed.Width % 2 == 0 ? -1 : 0);
e.Graphics.DrawEllipse(penRed,
new RectangleF(RegionInSet + PenRedOffset, RegionInSet + PenRedOffset,
pictureBox1.Width - (PenRedOffset * 2) - (RegionInSet * 2),
pictureBox1.Height - (PenRedOffset * 2) - (RegionInSet * 2)));
}
}
Визуальный результат:
![enter image description here](https://i.stack.imgur.com/OAeHh.gif)