На изображении Сохранить рисунок - PullRequest
0 голосов
/ 27 апреля 2011

Я создал небольшое приложение на C #, в котором я рисую прямоугольник при перемещении мыши.

Однако, когда форма свернута или развернута, рисунок стирается. Кроме того, когда я рисую второй раз, рисунок первого прямоугольника стирается.

Как я могу решить эту проблему? Вот код, который у меня сейчас есть:

   int X, Y;
    Graphics G;
    Rectangle Rec;
    int UpX, UpY, DwX, DwY;


    public Form1()
    {
        InitializeComponent();
        //G = panel1.CreateGraphics();
        //Rec = new Rectangle(X, Y, panel1.Width, panel1.Height);
    }


    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        UpX = e.X;
        UpY = e.Y;
        //Rec = new Rectangle(e.X, e.Y, 0, 0);
        //this.Invalidate();
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        DwX = e.X;
        DwY = e.Y;

        Rec = new Rectangle(UpX, UpY, DwX - UpX, DwY - UpY);
        Graphics G = pictureBox1.CreateGraphics();
        using (Pen pen = new Pen(Color.Red, 2))
        {
            G.DrawRectangle(pen, Rec);
        }
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {            
        if (e.Button == MouseButtons.Left)
        {
            // Draws the rectangle as the mouse moves
            Rec = new Rectangle(UpX, UpY, e.X - UpX, e.Y - UpY);
            Graphics G = pictureBox1.CreateGraphics();

            using (Pen pen = new Pen(Color.Red, 2))
            {
                G.DrawRectangle(pen, Rec);
            }
            G.Save();
            pictureBox1.SuspendLayout();
            pictureBox1.Invalidate();

        }

    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        pictureBox1.Update();            
    }

1 Ответ

2 голосов
/ 27 апреля 2011

Причина, по которой ваши рисунки стираются, заключается в том, что вы рисуете в 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!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...