none
Как сделать перерисовку GDI+? RRS feed

Ответы

  • Следующий код рисует линию на panel1 и оно больше не стирается:

            public Form1()
            {
                InitializeComponent();
                bitmap1 = new Bitmap(panel1.Width, panel1.Height);
            }
    
            Graphics G;
            Pen P;
            Bitmap bitmap1;
    
            private void button1_Click(object sender, EventArgs e)
            {
                G = Graphics.FromImage(bitmap1);
                P = new Pen(Color.Black, 3);
                G.DrawLine(P, 10, 10, 50, 50);
    
                panel1.Invalidate();
            }
    
            private void panel1_Paint(object sender, PaintEventArgs e)
            {
                e.Graphics.DrawImageUnscaled(bitmap1, 0, 0);
            }
    • Помечено в качестве ответа Ziya Ceferov 18 августа 2012 г. 11:33
    18 августа 2012 г. 11:32

Все ответы

  • в онпэйнте нужно перерисовать то что нарисовал в дги+.
    онпэйнт программно вызывается через инвалидате().
    а само оно вызвается вроде бы, если что-то испортило изображение.
    (окном другим поверх провели, например).
    Потому в онпэйнте и нужно прерисовывать чего нарисовал, если, конечно, нет цели оставить след от окна проведённого поверх.

    Вроде бы этого должно быть достаточно.
    а там, "в перемещку" написано для примера.

    ПС.
    Предвижу вопрос про мерцание.
    • Изменено INFEL8 4 августа 2012 г. 16:45
    • Помечено в качестве ответа Ziya Ceferov 6 августа 2012 г. 13:08
    • Снята пометка об ответе Ziya Ceferov 6 августа 2012 г. 13:34
    • Помечено в качестве ответа Abolmasov Dmitry 17 августа 2012 г. 7:12
    • Снята пометка об ответе Ziya Ceferov 17 августа 2012 г. 13:45
    4 августа 2012 г. 16:40
  • Вы, видимо, рисуете на форме - это не рационально, нужны перерисовки.
    Лучше пользоваться bitmap-ом.
    А еще лучше -
    http://code.msdn.microsoft.com/mschart/Release/ProjectReleases.aspx?ReleaseId=4418
    5 августа 2012 г. 12:20
  • Как сохранить изображение panel1, к примеру в Bitmap?
    • Изменено Ziya Ceferov 6 августа 2012 г. 11:50
    6 августа 2012 г. 11:49
  • Как сохранить изображение panel1, к примеру в Bitmap?

    Если один из предыдущих ответов вам помог с решением вашей задачи, то отметье его как ответ, а для нового вопроса создайте новый топик. Логика проста, пользователям будет легче искать ответы, есчли одни топик = один вопрос.

    Но раз начал писать, давайте покажу, как то что вы рисуете на панели сохранить в файл. Решение работает, может есть другие, но с ходу не вспомнил:

    panel1.BackgroundImage = new Bitmap(panel1.Width, panel1.Height);
    Graphics gr = Graphics.FromImage(panel1.BackgroundImage);
    gr.DrawLine(new Pen(Color.Red), 0, 0, 100, 100);
    panel1.BackgroundImage.Save(@"d:\1.png", ImageFormat.Png);
    На  панели появляется красная линия, на диске D появляется файл с серой заливакой и красной линией.
    6 августа 2012 г. 12:55
    Отвечающий
  • Я так понял что метод под именем OnPaint вызывается только тогда когда происходить стирание графики, как к примеру при передвижении по форме другого элемента, и следующий код не работает:

            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                if (panel1.BackgroundImage != null && panel1.Location != Point.Empty)
                {
                    e.Graphics.DrawImage(panel1.BackgroundImage, panel1.Location);
                }
            }

    А следующий код начинает работать сразу при запуске программы, а не тогда когда происходить стирание:

            protected override void OnPaint(PaintEventArgs e)
            {
                panel1.BackgroundImage = new Bitmap(panel1.Width, panel1.Height);
                G = panel1.CreateGraphics();
                G.DrawImage(panel1.BackgroundImage, new Point(0, 0));
            }
    Можете дать рабочий код перерисовки для panel1, чтобы мерцания тоже не было?
    • Изменено Ziya Ceferov 17 августа 2012 г. 8:47
    6 августа 2012 г. 13:39
  • Привет.

    OnPaint вызывается когда часть элемента или элемент полностью требует перерисовки себя, к этому отностися то, когда его перекрывают чем-либо.

    Ваш код перерисовки вполне верен, может быть условие If у вас не выполняется и поэтому не происходит отрисовка элемента, проверьте его.


    Для связи [mail]

    17 августа 2012 г. 7:11
  • Ваш код перерисовки вполне верен

    Но он не работает, при проведении поверх другое окно, происходит мерцание, но рисунок стирается.

    И так вот код из msdn:

    protected override void OnPaint(PaintEventArgs e)
    {
       // If there is an image and it has a location, 
       // paint it when the Form is repainted.
       base.OnPaint(e);
       if(this.picture != null && this.pictureLocation != Point.Empty)
       {
          e.Graphics.DrawImage(this.picture, this.pictureLocation);
       }
    }

    Вот ссылка на страницу:

    http://msdn.microsoft.com/ru-ru/library/system.windows.forms.control.onpaint.aspx

    Я проблему решить не смог, мне нужен код написанный для panel1 и чтобы мерцания не было.

    • Изменено Ziya Ceferov 17 августа 2012 г. 13:41
    17 августа 2012 г. 13:41
  • С мерцанием посложнее и это второе (сначала стирание без восстановления решить надо), там надо двойной буфер делать и тд.
    Мне как-то надоело с этим мучаться, и просто на WPF стал то же самое рисовать.
    И веселее работает без тормозов и прочего, и не мерцает.

    А можно кусочек Вашего проекта где-нибудь добыть?
    чтобы понять в чём дело, почему стирается.
    Может там просто в каком-то месте ошибка, стираться должно, но должно тут же восстанавливаться через онпэйнт.
    Если та this.Picture есть в памяти, которую перерисовываете на форму/панельку.



    • Изменено INFEL8 17 августа 2012 г. 14:33
    17 августа 2012 г. 14:31
  • На другом форуме мне сказали что это лучше делать событием Paint.

    Вот код который рисует, но рисунок появляется после перерисовки и больше не стирается:

            public Form1()
            {
                InitializeComponent();
                bitmap1 = new Bitmap(panel1.Width, panel1.Height);
            }
    
            Graphics G;
            Pen P;
            Bitmap bitmap1;
    
            private void button1_Click(object sender, EventArgs e)
            {
                G = Graphics.FromImage(bitmap1);
                P = new Pen(Color.Black, 3);
                G.DrawLine(P, 10, 10, 50, 50);
    
                panel1.Invalidate();
            }
    
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                e.Graphics.DrawImageUnscaled(bitmap1, 0, 0);
            }
    18 августа 2012 г. 9:04
  • Это наверное тот же код что и в другой теме,
    попробуйте событие перерисовки приделать не к форме, а к панельке.
    От формы отцепить наверное можно.
    18 августа 2012 г. 10:59
  • Следующий код рисует линию на panel1 и оно больше не стирается:

            public Form1()
            {
                InitializeComponent();
                bitmap1 = new Bitmap(panel1.Width, panel1.Height);
            }
    
            Graphics G;
            Pen P;
            Bitmap bitmap1;
    
            private void button1_Click(object sender, EventArgs e)
            {
                G = Graphics.FromImage(bitmap1);
                P = new Pen(Color.Black, 3);
                G.DrawLine(P, 10, 10, 50, 50);
    
                panel1.Invalidate();
            }
    
            private void panel1_Paint(object sender, PaintEventArgs e)
            {
                e.Graphics.DrawImageUnscaled(bitmap1, 0, 0);
            }
    • Помечено в качестве ответа Ziya Ceferov 18 августа 2012 г. 11:33
    18 августа 2012 г. 11:32
  • ну вот, сработало же )
    18 августа 2012 г. 11:59