Причина, по которой ваши рисунки стираются, заключается в том, что вы рисуете в Graphics
объект, полученный с помощью метода CreateGraphics
.В частности, эта строка вашего кода неверна:
Graphics G = pictureBox1.CreateGraphics();
Как вы обнаружили, всякий раз, когда форма перерисовывается (что происходит, когда она развернута, свернута или закрыта другойобъект на экране (или в ряде других возможных ситуаций), все, что вы нарисовали в этот временный Graphics
объект, будет потеряно.Форма полностью перерисовывает свою внутреннюю логику рисования;полностью забыто о том, что вы временно нарисовали поверх него.
правильный способ рисовать постоянные изображения в WinForms - переопределить OnPaint
метод элемент управления, на который вы хотите рисовать (или вы также можете обработать событие Paint
).Итак, если вы хотите рисовать на вашей форме, вы должны поместить свой код для рисования в следующий метод:
protected override void OnPaint(PaintEventArgs e)
{
// Call the base class first
base.OnPaint(e);
// Then insert your custom drawing code
Rec = new Rectangle(UpX, UpY, DwX - UpX, DwY - UpY);
using (Pen pen = new Pen(Color.Red, 2))
{
e.Graphics.DrawRectangle(pen, Rec);
}
}
А чтобы вызвать перерисовку, вы просто вызываете метод Invalidate
в любом из событий мыши (MouseDown
, MouseMove
и MouseUp
):
this.Invalidate();
Обратите внимание, однако, что нет абсолютно никаких причин для вызова Update
method в обработчике событий Paint
.Все, что вызывает метод Update
, это заставляет элемент управления перерисовываться.Но это уже происходит, когда возникает событие Paint
!