繁体   English   中英

在C#Windows Forms应用程序中绘制同心圆

[英]Drawing concentric circle in c# windows forms application

我试图在组框上画一个圆,当文本框输入更改时,圆的大小应该立即更改。

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

您永远不会直接调用Paint方法。 取而代之的是,通常让Windows通过调用groupBox1.Invalidate();来决定何时重绘groupBox1.Invalidate();

原因是该控件可能被隐藏,或者有太多的绘画请求挂起。 然后Windows可能决定删除其中一些。

不要使用this.Controls.Add(groupBox1);重新添加您的控件this.Controls.Add(groupBox1);

不要重新订阅事件处理程序。 可以在构造函数中使用+=一次订阅,也可以通过将属性窗口切换到事件(单击Flash符号),然后双击paint事件,从表单设计器中进行订阅。

private void textBox1_TextChanged(object sender, EventArgs e)
{
    groupBox1.Invalidate();
}

如果刷新必须真的非常即时(但是如果您正在制作动画,则可能只是这种情况),请调用groupBox1.Refresh(); ;

请参阅: Control.Invalidate,Control.Update和Control.Refresh有什么区别?


事件的工作方式如下:希望在事件发生时做一些事情的方法,使用+=订阅事件(仅一次!)。 您可以在代码中手动执行此操作,也可以在表单设计器中轻松执行此操作。 然后一些逻辑引发该事件。 在这种情况下,逻辑将隐藏在Invalidate方法中。 然后,将执行所有订阅事件的方法。

请参阅: 如何:引发和消费事件
通过搜索C#事件,您会发现很多教程和示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM