none
C# windows forms выдает ошибку при свертывании окна RRS feed

  • Вопрос

  • Здравствуйте!

    У меня есть код, рисует функцию при клике на кнопку, вроде все хорошо, но если свернуть окно то выдается ошибка:

    An unhandled exception of type 'System.ArgumentException' occurred in System.Drawing.dll

    и программа указывает на следующую строку:

    buff = new Bitmap(pole.Width, pole.Height);

    В чем ошибка? и как её исправить?

    Заранее спасибо!

    using System;
    
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace graficasfunciones
    {
        public partial class Grafico : Form
        {
            Random r = new Random();
            Bitmap buff = null;
            int pio = 0;
    
            public Grafico()
            {
                InitializeComponent();
                DoubleBuffered = true;
                
            }
    
            void draw()
            {
                if (buff == null)
                    buff = new Bitmap(pole.Width, pole.Height);
           
                Graphics g = Graphics.FromImage(buff);
                Pen p = new Pen(Color.Red);
    
                for (double x = 0; x < 100; x = x + 0.01)
                {
                    double y = Math.Sin(x);
                    int xx = (int)(x * 50);
                    int yy = 150 + (int)(y * 100);
                    g.DrawEllipse(p, xx, yy, 1, 1); 
                }
            }
    
            void redraw()
            {
                if (buff == null) 
                    draw();
                Graphics g = Graphics.FromHwnd(pole.Handle);
                g.DrawImageUnscaled(buff, 0, 0);
            }
    
    
            private void clickboton(object sender, EventArgs e)
            {
                draw();
                redraw();
                pio = 1;
            }
    
            private void pole_Paint(object sender, PaintEventArgs e)
            {
                if (pio == 1) {
                    redraw();
                }
            }
    
            private void pole_Resize(object sender, EventArgs e)
            {
                if (pio == 1)
                {
                    buff = null;
                    draw();
                    redraw();
                }
            }
        }
    }
    
    
    12 февраля 2014 г. 19:46

Ответы

  • Это не выход. Попробуйте мышкой уменьшить размер окна до размеров одного заголовка - получите ту же ошибку. Логичнее сделать проверку размеров pole прямо в методе draw()

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    14 февраля 2014 г. 13:09

Все ответы

  • попробуйте поменять местами

     private void clickboton(object sender, EventArgs e)
            {
                pio = 1;
                draw();
                redraw();
                //pio = 1;
            }
    

    12 февраля 2014 г. 20:07
  • Я так понимаю, что pole - это элемент управления, в котором Вы рисуете? Тогда все верно, когда приложение сворачивается, размеры поля = 0, поэтому конструктор Bitmap и "нервничает" :)

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Предложено в качестве ответа kosuke904 25 февраля 2014 г. 14:52
    13 февраля 2014 г. 10:51
  • Последовательность вызовов получается следующая: Сворачиваем окно - pole_Resize() - draw() - Bitmap(..., ...)

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    13 февраля 2014 г. 10:54
  • спасибо за ответы!

    решил проблему добавив в pole_resize дополнительное условие:

    if (pio == 1 && WindowState != FormWindowState.Minimized)

    13 февраля 2014 г. 14:11
  • Это не выход. Попробуйте мышкой уменьшить размер окна до размеров одного заголовка - получите ту же ошибку. Логичнее сделать проверку размеров pole прямо в методе draw()

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    14 февраля 2014 г. 13:09