PaintEventArgs e.Graphics
дает вам DeviceContext элемента управления (считайте его ссылкой на графическую поверхность элемента управления) и набор инструментов, которыеможет использоваться для выполнения графических операций в этом контексте.
При использовании e.Graphics
все рисунки находятся внутри базовой поверхности, на которую ссылается графический объект (a PictureBox
ClipRectangle вв этом случае).
Все координаты относятся к этой области.
Таким образом, вам просто нужно указать положение и размер чертежа, используя клиентскую область элемента управления в качестве единственной ссылки.Размеры области рисования также сообщаются с помощью e.Graphics.ClipBounds (выражается в PageUnits ) и элемента управления ClientRectangle (выражается в Pixels
).
ClientRectangle
- это область элемента управления, которая исключает не клиентские элементы, такие как Borders
, Menus
, ScrollBars
, TitleBar
и т. Д .;это «внутреннее тело».
Однако определение клиентской области может измениться относительно внутренней структуры элемента управления (например, представьте элемент управления ListView
или ComboBox
).
Событие Paint()
элемента управления вызывается каждый раз, когда элемент управления должен перерисоваться.
Он всегда вызывается после первого создания элемента управления.
Послечто он может быть запущен, когда, например, элемент управления по некоторым причинам «скрыт» другим элементом управления / окном или когда Form
, содержащий его, свернут.
Его можно поднять«вручную», вызывая метод Invalidate () элемента управления.
Это, вероятно, предпочтительный способ заставить элемент управления перерисовывать себя, потому что метод Invalidate()
позволяет указать определенную часть (a * 1053).* или Region ) элемента управления, который требует перекраски, ограничивая рисование этой областью.
Вы можете изменить свой код следующим образом:
public Form1()
{
InitializeComponent();
pictureBox1.Paint += new PaintEventHandler(this.pictureBox1_Paint);
pictureBox2.Paint += new PaintEventHandler(this.pictureBox2_Paint);
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.FillEllipse(Brushes.Red, new Rectangle(40, 40, 20, 20));
e.Graphics.FillEllipse(Brushes.Red, new Rectangle(40, 80, 20, 20));
e.Graphics.FillEllipse(Brushes.Red, new Rectangle(80, 40, 20, 20));
e.Graphics.FillEllipse(Brushes.Red, new Rectangle(80, 80, 20, 20));
}
private void pictureBox2_Paint(object sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.FillEllipse(Brushes.Red, new Rectangle(40, 40, 20, 20));
e.Graphics.FillEllipse(Brushes.Red, new Rectangle(40, 80, 20, 20));
e.Graphics.FillEllipse(Brushes.Red, new Rectangle(80, 40, 20, 20));
e.Graphics.FillEllipse(Brushes.Red, new Rectangle(80, 80, 20, 20));
}
SmoothingMode = SmoothingMode.AntiAlias
используется для "prettify "приводит к графике.
Она генерирует более плавные границы.
Используемая Кисть для рисования является стандартным объектом (предоставляется системой), который не нуждается вbe Disposed()
.
Если вы создаете Brush
с использованием одного из классов, связанных с кистью, создаваемый объект должен быть удален.
using (SolidBrush brush = new SolidBrush(Color.Red))
{
e.Graphics.FillEllipse(brush, new Rectangle(40, 40, 20, 20));
}