Почему в некоторых случаях событие Paint не вызывается?

Помогите пожалуйста!!! Данный кусок программы должен нарисовать рандомный круг при появлении нового checkBox. Но выполняется только один вход в событие Paint, следовательно рисуется только один круг.
И есть еще один вопросик. Когда в конце numericUpDown1_ValueChanged я писала this.Invalidate рисовалось необходимое количество кругов, но только в разных пространствах) Объясните пожалуйста почему так происходит!!!
public partial class Form1 : Form
    {
        int A;
        
        int wBoxA;
      
        int chA = 0;
        bool prA = false;
        int oldA = 0;

        List<FIGUR> oval = new List<FIGUR>();
        List<CheckBox> cheke = new List<CheckBox>();

       public Bitmap bmp;
        public Form1()
        {
            InitializeComponent();

            A = Convert.ToInt32(numericUpDown1.Value);
           
            wBoxA = 67;
          

            bmp = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);
            RefreshBitmap(oval);
            this.Paint += Form1_Paint;
        }

        
        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            int newA = Convert.ToInt32(numericUpDown1.Value);
            if (A < newA)
            {
                for (int i = A; i < newA; i++)
                {
                    CheckBox boxik = new CheckBox();
                    boxik.Size = new Size(10, 10);
                    boxik.Location = new Point(wBoxA, 15);
                    boxik.Name = "A"+(i).ToString();
                    boxik.CheckState = CheckState.Checked;

                    this.Controls.Add(boxik);
                    wBoxA += 14;
                    
                }
                oldA = A;
                A = newA;
                prA = true;

            }
            else if (A>newA)
            {
                for (int i = A; i > newA; i--)
                {
                    this.Controls.RemoveByKey("A" + (i-1).ToString());
                    wBoxA -= 14;
                }
                A = newA;
            }
            
        }

      
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
           
            if (prA)
            {
                Random rnd = new Random(DateTime.Now.Millisecond);

                for (int i = oldA; i < A; i++)
                {
                    
                    SolidBrush bru = new SolidBrush(Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256)));
                    FIGUR o = new RECTANGLE(rnd.Next(250), rnd.Next(250), rnd.Next(150), rnd.Next(150), new GraphicsPath(), bru);
                    oval.Add(o);
                }
                prA = false;
                RefreshBitmap(oval);
                e.Graphics.DrawImage(bmp, 0, 0);
            }

            
        }

        void RefreshBitmap(List<FIGUR> tipFig)
        {
            if (bmp != null)
            {
                bmp.Dispose();
            }
            bmp = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);
            using(Graphics g = Graphics.FromImage(bmp))
            {
                foreach (FIGUR fig in tipFig)
                {
                    fig.draw(g);
                }
            }

        }
    }

А ниже кусок класса который рисует

class RECTANGLE : FIGUR
    {
        GraphicsPath path;
        Pen pen;
        Brush brush;

 

        public RECTANGLE(float ax, float ay, float aw, float ah, GraphicsPath apath, Brush abrush) : base(ax, ay, aw, ah) 
        {
            path = apath;
            brush = abrush;
        }
        public override void draw(Graphics ag)
        {
            path.AddEllipse(x, y, w, h);//добавляет овал в прямоугольнике
            ag.FillPath(brush, path);
            
        }
  • Вопрос задан
  • 63 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы