在c#windows窗体应用程序中绘制同心圆

时间:2016-06-22 19:56:44

标签: c# winforms

我正在尝试在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);
}

1 个答案:

答案 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#活动,您将找到许多教程和示例。

相关问题