我正在尝试在groupbox上绘制一个圆圈,当文本框输入发生变化时,圆圈的大小会立即发生变化。
private void groupBox1_Paint(object sender, PaintEventArgs e)
{
//CIRCLE
Graphics graphics = e.Graphics;
Pen p = new Pen(Color.Black, 1);
float S = float.Parse(textBox1.Text);
Rectangle r = new Rectangle(50, 50, (int)S, (int)S);
graphics.DrawEllipse(p, r);
graphics.Dispose();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
groupBox1.Paint += new PaintEventHandler(this.groupBox1_Paint);
this.Controls.Add(groupBox1);
}
答案 0 :(得分:2)
您永远不会直接调用Paint方法。相反,您通常会通过调用groupBox1.Invalidate();
让Windows决定何时重绘。
原因是,控件可能被隐藏或者有太多的paint请求待处理。然后,Windows可能决定放弃其中一些。
不要使用this.Controls.Add(groupBox1);
重新添加您的控件!
不要重新订阅事件处理程序。要么在构造函数中订阅一次(使用+=
),要么通过将属性窗口切换到事件(单击flash符号)然后双击绘制事件,从表单设计器中进行订阅。
private void textBox1_TextChanged(object sender, EventArgs e)
{
groupBox1.Invalidate();
}
如果刷新必须非常直接(但这可能只是你做动画的情况),那么请致电groupBox1.Refresh();
;
请参阅:Whats the difference between Control.Invalidate, Control.Update and Control.Refresh?
事件的工作方式如下:在事件发生时希望做某事的方法,使用+=
订阅事件(仅一次!)。您可以在代码中手动执行此操作,也可以在表单设计器中执行此操作。然后一些逻辑引发了事件。在这种情况下,逻辑隐藏在Invalidate
方法中。然后执行订阅事件的所有方法。
请参阅:How to: Raise and Consume Events 通过Google搜索C#活动,您将找到许多教程和示例。