一次又一次地使Windows窗体失效
本文关键字:窗体 失效 Windows 一次又一次 | 更新日期: 2023-09-27 17:50:03
我使用此代码来绘制一些圆圈,但它不断重绘和重绘,并停止与错误,textBox1。文本有不好的数字格式,即使我尝试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();
}
}
}
}
为什么每次单击按钮时都附加事件处理程序?这意味着您将拥有与按钮点击一样多的事件处理程序,我怀疑这是您想要的。
然而,您的重绘问题可能是您在Paint事件处理程序中调用Invalidate
的事实。这将强制重新绘制表单。所以每次你绘制,你都会触发一个新的绘制,它会触发一个新的绘制,以此类推
你不应该在Paint调用中失效。
根据一些整数或布尔值处理绘画。在单击事件中设置整数或布尔值,并在按钮单击处理程序中调用Invalidate。
this.Paint += new PaintEventHandler(KresliTerc);
你在哪里调用这个,因为它是一个绘制事件,它会在绘制发生时反复调用
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();
}