为单选按钮添加LED






3.90/5 (6投票s)
2002年6月18日
3分钟阅读

146343

1248
增强您的单选按钮的视觉效果。
引言
在为我的 Kenwood R-5000 短波接收器编写软件前端之后,我对白色圆圈/黑色圆点标准单选按钮的外观并不满意。毕竟,我的 Kenwood 在每个按钮的顶角都有这些非常酷炫的 LED,以显示当前处于活动状态的按钮。如何在 C# 中模拟这一点以增强我的项目?在尝试了 Alexandr Khilov 非常好的 cute button之后,我找到了方法。将其子类化为 RadioButton
而不是 Button
,在左上角画一个三角形,将其设置为一种颜色,然后添加一些代码将所有内容连接在一起!我发现最终结果在视觉上非常有吸引力,希望你也能找到我从未考虑过的用途。这是演示项目的一个快照,向你展示了可能实现的效果。你不一定能理解,但这确实是可能的。
关于该控件的更多信息
我添加了一些 Alex 项目中没有的其他内容,主要是一个用于每个属性的属性头,以便在设计模式下提供一些帮助
[
Bindable(true),
Category("Appearance"),
Description("Sets the width of the LED in % of control's width")
]
public int LEDWidth{
get {return m_width;}
set {m_width = value; Invalidate();
}
当然,必须添加几个新元素,这里有一个快速的概述
LEDColor
:LED 在关闭模式下的颜色。我最喜欢的是 DarkRed、Green 和 DarkGoldenRod(用于黄色 LED)。LEDWidth
:一个整数,表示你希望 LED 覆盖控件宽度的百分比。LEDHeight
:一个整数,表示你希望 LED 覆盖控件高度的百分比。通过使用这些数字,你可以制作一些看起来非常奇怪的 LED。我发现,对于矩形控件,大约 10% 的宽度和 40% 的高度看起来不错。LEDOffset
:控件边缘和 LED 之间的像素数。
我还更改了 Alex 的几个标识符,因为我更喜欢按钮从上到下而不是从左到右渐变
topColor
:设置控件顶部的颜色,该颜色最终将渐变到由属性bottomColor
设置的颜色。透明度值也类似命名。
我添加了一个 boolean
变量 onOff
,以便将按钮的状态传递给 onPaint
事件处理程序,并为 Alex 已经出色的工作添加了一些额外的代码
if(onOff == true){
c3 = System.Windows.Forms.ControlPaint.LightLight(m_ledcolor);
}
else{
c3 = System.Windows.Forms.ControlPaint.Dark(m_ledcolor);
}
SolidBrush sb = new SolidBrush(c3);
Pen blackPen = new Pen(Color.Black , 2);
//set the drawing points for the triangle
Point point1 = new Point( m_offset, m_offset);
Point point2 = new Point(m_offset, triHeight());
Point point3 = new Point(triWidth(),m_offset);
Point point4 = new Point(m_offset,m_offset);
//put them all in an array of Points
Point[] triPoints = {
point1,
point2,
point3,
point4,
};
pe.Graphics.DrawPolygon(blackPen, triPoints);
//thanks to Anonymous for this suggestion!
pe.Graphics.SmoothingMode=System.Drawing.Drawing2D.
SmoothingMode.HighQuality;
pe.Graphics.FillPolygon(sb,triPoints,
System.Drawing.Drawing2D.FillMode.Winding);
特别值得关注的可能是 ControlPaint.LightLight
和 ControlPaint.Dark
方法。无需弄乱位掩码或亮度值来更改颜色,这些函数完成了所有脏活!triHeight()
和 triWidth()
函数仅计算三角形正确大小所需的像素数。
virtual protected int triHeight(){
float x;
x = this.Height * ((float)m_height/100);
return (int)x;
}
virtual protected int triWidth(){
float x;
x = this.Width * ((float)m_width/100);
return (int)x;
}
感谢 DeepStack 指出如何强制 Button
的 Appearance
属性为 Bu
t
ton
而不是 Default
。
可能的增强功能包括
允许设计师选择放置 LED 的角。我对左上角很满意,所以我将其保留为未来的项目。
将 LED 的形状更改为圆形或正方形或菱形或其他形状。再说一次,我打算使用三角形形状来模拟真实的单选按钮,所以我保持原样。
关于 Duane Lunday
我是一位经验丰富的程序员,最近与我之前工作了 10 年的雇主签署了一份长期的非补偿协议。我一直在利用我的空闲时间来赶上 C# 和 .NET 框架的总体进度。如果你对短波无线电软件和间谍电台特别感兴趣,请从 http://www.codedragon.net. 下载我用 C# 编写的 SpyCatcher 软件。