#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();
}