创建自定义控件
创建一个继承自 Panel 的自定义控件是更优雅、复用性更强的方案。你可以将其编译到类库中,然后在多个项目中像使用标准控件一样使用它。
步骤与代码
1.创建自定义控件类:
在项目中添加一个新的类文件,例如 SignalLight.cs。
public class SignalLight : Panel
{
// 默认为红色
private Color _lightColor = Color.Red;
public Color LightColor
{
get { return _lightColor; }
set
{
_lightColor = value;
this.Invalidate(); // 颜色改变时重绘控件
}
}
public SignalLight()
{
// 双缓冲和调整大小时重绘,可以减少闪烁
this.DoubleBuffered = true;
this.SetStyle(ControlStyles.ResizeRedraw, true);
}
// 重写OnPaint方法进行绘制
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e); // 可选,是否先绘制基类背景
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
// 使用当前设置的LightColor进行绘制
using (Brush lightBrush = new SolidBrush(LightColor))
{
e.Graphics.FillEllipse(lightBrush, this.ClientRectangle);
}
}
// 可选但重要:重写OnResize确保圆形随控件大小正确调整
protected override void OnResize(System.EventArgs e)
{
base.OnResize(e);
// 将控件的Region设置为圆形区域,实现真正的圆形而不仅是绘制外观
using (GraphicsPath path = new GraphicsPath())
{
path.AddEllipse(this.ClientRectangle);
this.Region = new Region(path);
}
}
}
2.使用自定义控件:
重新生成项目后,在工具箱中会出现 SignalLight 控件。
将其拖拽到窗体上,就可以像普通 Panel 一样使用,并通过属性窗口设置 LightColor。
说明:
OnResize 方法的作用:FillEllipse 只是在矩形区域内画一个圆形的图案,控件本身的边界仍然是矩形的。通过重写 OnResize,我们将控件的可见区域(Region)设置为一个圆形路径。这样,控件就变成了一个真正的圆形,其周围的区域(四个角)将无法点击且透明。
将 LightColor 属性设置为 public 并触发 Invalidate(),允许你在设计时或运行时轻松更改指示灯的颜色
3.总结



2627

被折叠的 条评论
为什么被折叠?



