构建一个酷酷的七段LED显示器

在这篇文章中,将探讨如何构建一个类似于闹钟和工业监视器中使用的七段LED显示器。这种显示器可以用于显示时间、数值甚至一些英文字符,对于硬件仿真程序等应用场景非常有用。

在7段LED显示器中,一个字符最多由7个部分组成,如图1所示。每个部分具有以下属性:部分的宽度、部分角落的倒角率以及部分之间的间隔。如果按照图1所示的方式给这7个部分编号,那么可以使用索引来表示不同的字符。例如,字符"1"可以表示为(2, 3),而字符"5"可以表示为(1, 6, 7, 3, 4)。为了绘制整个场景,首先需要计算绘制特定字符的边界矩形,然后在每个指定的边界矩形中绘制部分。在指定的边界矩形中绘制7段LED字符的算法如图3所示。

使用代码

这个控件非常容易使用。只需将其从工具箱拖动到设计模式下的表单中,然后调整其提供的属性以修改其外观。属性列表如下:

  • BorderWidth - int:获取或设置控件周围边框的宽度。
  • BorderColor - System.Color:获取或设置控件周围边框的颜色。
  • HighlightOpaque - byte:获取或设置高光的不透明度。0表示高光将透明结束,而100表示高光将保持其从开始的透明度。
  • ShowHighlight - bool:获取或设置一个值,指示是否在控件上显示高光区域。如果设置为false,则忽略HighlightOpaque属性的值。
  • CornerRadius - int:获取或设置控件的圆角半径。如果RoundCorner等于false,则忽略此属性的值。有效值范围从1到10。
  • GradientBackground - bool:获取或设置一个值,指示背景是否用渐变色填充。
  • BackColor_1 - System.Color:获取或设置第一种背景颜色。如果GradientBackground等于true,则此颜色将是背景矩形顶部的颜色。否则,此颜色将是纯色背景。
  • BackColor_2 - System.Color:获取或设置第二种背景颜色。如果GradientBackground等于true,则此颜色将是背景矩形底部的颜色。否则,此颜色将被忽略。
  • RoundCorner - bool:获取或设置边框样式。如果为true,则控件的边框将是一个圆角矩形。否则,边框是一个普通矩形。
  • SegmentIntervalRatio - int:获取或设置部分间隔比率。这个值越大,部分之间的间隙就越宽。
  • TextAlignment - Alignment:获取或设置文本的对齐方式。
  • SegmentWidthRatio - int:获取或设置部分宽度比率。这个值越大,部分就越宽。
  • TotalCharCount - int:获取或设置要显示的字符总数。如果显示文本中包含的字符数大于这个值,显示的字符将被截断。
  • BevelRate - float:获取或设置每个部分的倒角率。有关更多信息,请参考图2。
  • FadedColor - System.Color:获取或设置背景字符的褪色颜色。
  • Text - string:获取或设置控件的文本。

兴趣点

在表示层的控件可能会进行大量的绘制。大多数情况下,当控件的属性发生变化时,控件需要重新绘制。如果控件的多个属性在短时间内连续变化,可能会导致多次无效。为了避免多次绘制,可以在控件中实现ISupportInitialize接口。首先,在BeginInit()方法中设置一个成员变量。

private bool m_bIsInitializing = false; void ISupportInitialize.BeginInit() { m_bIsInitializing = true; }

然后以以下方式重写属性:

public Color FadedColor { get { return m_colFadedColor; } set { if (m_colFadedColor == value) return; m_colFadedColor = value; // 检查控件是否处于初始化模式 if (!m_bIsInitializing) { Invalidate(); } } }

最后,在EndInit()方法中,关闭初始化模式并重新绘制控件。

void ISupportInitialize.EndInit() { m_bIsInitializing = false; Invalidate(); } ((System.ComponentModel.ISupportInitialize)mycontrol).BeginInit(); mycontrol.BackColor = System.Drawing.Color.Transparent; mycontrol.BackColor_1 = System.Drawing.Color.Black; mycontrol.BackColor_2 = System.Drawing.Color.Transparent; mycontrol.BevelRate = 0.5F; mycontrol.BorderColor = System.Drawing.Color.White; mycontrol.FadedColor = System.Drawing.Color.Black; ((System.ComponentModel.ISupportInitialize)mycontrol).EndInit();
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485