在这篇文章中,将探讨如何构建一个类似于闹钟和工业监视器中使用的七段LED显示器。这种显示器可以用于显示时间、数值甚至一些英文字符,对于硬件仿真程序等应用场景非常有用。
在7段LED显示器中,一个字符最多由7个部分组成,如图1所示。每个部分具有以下属性:部分的宽度、部分角落的倒角率以及部分之间的间隔。如果按照图1所示的方式给这7个部分编号,那么可以使用索引来表示不同的字符。例如,字符"1"可以表示为(2, 3),而字符"5"可以表示为(1, 6, 7, 3, 4)。为了绘制整个场景,首先需要计算绘制特定字符的边界矩形,然后在每个指定的边界矩形中绘制部分。在指定的边界矩形中绘制7段LED字符的算法如图3所示。
这个控件非常容易使用。只需将其从工具箱拖动到设计模式下的表单中,然后调整其提供的属性以修改其外观。属性列表如下:
在表示层的控件可能会进行大量的绘制。大多数情况下,当控件的属性发生变化时,控件需要重新绘制。如果控件的多个属性在短时间内连续变化,可能会导致多次无效。为了避免多次绘制,可以在控件中实现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();