Снова и снова аннулирование Windows Forms

#c# #winforms #drawing

#c# #winforms #рисование

Вопрос:

Я использую этот код, чтобы нарисовать несколько кругов, но он продолжает перерисовываться и останавливается с ошибкой, что TextBox1.text имеет неверный числовой формат, даже когда я пытаюсь 5 или 6. Что в этом плохого?

 using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace terc
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();

            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
        }






        void Button1Click(object sender, EventArgs e)
        {
            this.Paint  = new PaintEventHandler(KresliTerc);
        }

        protected void KresliTerc(object sender,PaintEventArgs e)
        {
            Graphics grfx = e.Graphics;
            int pocet = int.Parse(textBox1.Text);
            label1.Text = pocet.ToString();

            for(int i=1; i <= pocet; i  )
            {
                grfx.FillEllipse(Brushes.Black,ClientSize.Width/2,ClientSize.Height/2,50*i,50*i);
                Invalidate();
            }

        }
    }
}
  

Комментарии:

1. Я не совсем понимаю проблему с числовым форматом. Не могли бы вы немного подробнее остановиться на этом?

Ответ №1:

Почему вы прикрепляете обработчик событий каждый раз, когда нажимается кнопка? Это означает, что у вас будет столько обработчиков событий, сколько нажатий кнопок, что, я сомневаюсь, это то, чего вы хотите.

Однако ваша проблема с перерисовкой, вероятно, заключается в том факте, что вы вызываете Invalidate внутри обработчика событий Paint. Это приведет к новой перерисовке формы. Таким образом, каждый раз, когда вы рисуете, вы запускаете новый paint, который запускает новый paint и так далее.

Комментарии:

1. Вам нужно сделать недействительным только один раз ИЗВНЕ события Paint

2. переопределите событие OnPaint, затем выполните пользовательский отрисовку!

3. Но мне нужно рисовать, когда кто-то нажимает кнопку

4. @Dunemaster: затем вы должны вызвать Invalidate обработчик нажатия кнопки и переместить код, чтобы присоединить обработчик события paint к MainForm конструктору (после вызова InitializeComponent ).

Ответ №2:

Вы не должны делать недействительным вызов Paint.

Обрабатывайте отображение на основе некоторых целых или логических значений. Установите целочисленные или логические значения в событиях нажатия и просто вызовите Invalidate в обработчике нажатия кнопки.

Ответ №3:

  this.Paint  = new PaintEventHandler(KresliTerc);
  

где вы это вызываете, поскольку это событие рисования, оно будет вызываться снова и снова при выполнении рисования

Комментарии:

1. Кроме того, вам следует добавить метод обработчика несколько раз. При каждом нажатии кнопки вы будете добавлять новый обработчик, и каждый из них будет вызван.

Ответ №4:

        Boolean isButtonClicked;

        protected override void OnPaint(PaintEventArgs e)
        {
            if (this.isButtonClicked)
            {
                this.isButtonClicked = false;
                // some paint logic goes down here...
                e.Graphics.FillEllipse(Brushes.YellowGreen, 12, 12, 54, 54);
            }
        }

        private void HandleOnButtonClick(Object sender, EventArgs e)
        {
            this.isButtonClicked = true;
            this.Invalidate();
        }