工业控件 2






4.92/5 (131投票s)
一个控件库,

引言
在我上一篇文章中,我创建了这个库的第一个版本,包含基本控件和功能。现在,我想为库添加更多控件,以便能够使用它来创建控制流程的表单或出于多种原因。
要编译此演示,您需要 .NET 2.0。可以在此处获取。该项目是用SharpDevelop开发的,一个免费的 .NET IDE,但也可以使用VCS 2008 express edition。
控件说明
在此版本的库中,我包含以下类型的控件
- 可视化控件
- LED灯
- 显示
- 仪表
- 命令控件
- 按钮
- 旋钮
所有控件都派生自 LBSoft.IndustrialCtrls.Base.LBIndustrialCtrlBase
,并有一个类别,您可以在其中编辑属性,以及默认属性。通常所有类都有一个默认的渲染器类,用于绘制所有部分,但也可以设置自定义渲染器来绘制单个部分或整个控件。
库命名空间
LBSoft.IndustrialCtrls.Base
在此命名空间中,有创建库中所有控件和渲染器的基类。基类是
LBIndustrialCtrlBase
是控件的基类LBRendererBase
是渲染器的基类
LBIndustrialCtrlBase
此类派生自 UserControl
。此类包含各种虚拟方法和属性来管理控件中的数据和事件。类中的虚拟方法是
IRenderer CreateDefaultRenderer()
- 此方法在构造函数中调用,以创建控件的默认渲染器。void CalculateDimensions()
- 此方法在构造函数中调用,以更新关联渲染器类或默认渲染器中的数据。
类的属性是
IRenderer DefaultRenderer
- 获取控件的默认渲染器IRenderer Renderer
- 获取或设置控件的自定义渲染器
LBRendererBase
此类是渲染器的基类,并实现了 ILBRenderer
接口。此类包含各种虚拟方法和属性来绘制控件。类中的虚拟方法是
void Draw( Graphics gr )
- 当绘制消息要求重绘控件时调用此方法。void Update()
- 此方法由控件的CalculateDimensions()
方法调用,以更新渲染器中的绘制数据。
类的属性是
object Control
- 获取或设置与渲染器关联的控件
LBSoft.IndustrialCtrls.Leds
在此命名空间中,有模拟 LED 以可视化状态的控件和用于查看值的 7 段显示器。
LBLed
对于此类,您可以在设计时设置以下属性
LED灯属性
LedColor
- LED 灯的颜色。代码修改颜色以模拟暗部。LedSize
- LED 灯的大小。您可以设置不同的宽度和高度来更改控件的外观。Style
- LED 灯的样式。此属性的类型为LedStyle
,可用值为圆形
矩形
State
- LED 灯的状态。此属性的类型为LedState
,可用值为关闭
On
闪烁
LabelPosition
- 控件标签的位置。此属性的类型为LedLabelPosition
,可用值为左侧
顶部
右侧
底部
Label
- 控件标签的文本BlinkInterval
- 闪烁状态更改的间隔(以毫秒为单位)
有两个属性在设计时不可见,它们是
BlinkIsOn
- 闪烁状态当前状态的标志
LB7SegmentDisplay
对于此类,您可以在设计时设置以下属性
显示属性
ShowDP
- 显示或隐藏显示器的小数点Value
- 设置显示器的值
要更改控件的颜色,请使用 BackColor
和 ForeColor
属性。
LBSoft.IndustrialCtrls.Meters
在此命名空间中,有模拟仪表(模拟或数字)以查看值的控件
LBDigitalMeter
对于此类,您可以在设计时设置以下属性
数字仪表属性
Signed
- 设置显示器的符号。如果设置为true
,则显示器显示带符号的值Format
- 设置要显示的值的格式。此格式的一个示例是0000.00
。在此模式下,显示值与图像相同。Value
- 设置仪表的当前值。
与 LB7SegmentDisplay
类似,要更改控件的颜色,请使用 BackColor
和 ForeColor
属性。
LBAnalogMeter
对于此类,您可以在设计时设置以下属性
模拟仪表属性
MeterStyle
- 控件的样式。此属性的类型为AnalogMeterStyle
,可用值为圆形
BodyColor
- 控件主体的颜色NeedleColor
- 指针的颜色ScaleColor
- 控件刻度线标记的颜色ScaleDivisions
- 刻度的主要刻度线数量ScaleSubDivisions
- 刻度主要刻度线之间的子刻度线数量ViewGlass
- 用于可视化玻璃效果的标志Value
- 控件的当前值MinValue
- 控件的最小值MaxValue
- 控件的最大值
有两个属性在设计时不可见,它们是
Thresholds
-LBMeterThreshold
对象的集合。
LBMeterThreshold
类用于绘制仪表控件中的阈值,以在测量值达到临界值时进行可视化。此类具有以下属性
Color
- 阈值的颜色StartValue
- 阈值的起始值EndValue
- 阈值的结束值
这是在仪表控件中设置阈值的一个示例
...
public void SetThresholds()
{
LBMeterThreshold threshold = new LBMeterThreshold();
threshold.Color = Color.Yellow;
threshold.StartValue = 50;
threshold.EndValue = 70;
this.lbAnalogMeter1.Thresholds.Add ( threshold );
threshold = new LBMeterThreshold();
threshold.Color = Color.Red;
threshold.StartValue = 70;
threshold.EndValue = 100;
this.lbAnalogMeter1.Thresholds.Add ( threshold );
}
...
LBSoft.IndustrialCtrls.Buttons
在此命名空间中,有模拟按钮以发送命令的控件。目前只有一个类 LBButton。
对于此类,您可以在设计时设置以下属性
按钮属性
Style
- 控件的样式。此属性的类型为ButtonStyle
,可用值为圆形
矩形
椭圆形
ButtonColor
- 按钮的颜色Label
- 按钮的标签State
- 按钮的状态。此属性的类型为ButtonState
,可用值为正常
按压
RepeatState
- 按钮的重复状态。将此状态设置为true
时,按钮会以重复属性中设置的间隔发送事件StartRepeatInterval
- 第一个重复间隔(以毫秒为单位)RepeatInterval
- 重复间隔(以毫秒为单位)
事件
当状态更改时,此控件会触发一个事件来通知连接的类。此事件是
ButtonChangeState ( object sender, LBButtonEventArgs e );
事件参数的 State
属性是按钮的当前状态。
LBSoft.IndustrialCtrls.Knobs
在此命名空间中,有模拟旋钮以更改值的控件(类似于滑块)。目前只有一个类 LBKnob
。对于此类,您可以在设计时设置以下属性。
旋钮属性
Style
- 控件的样式。此属性的类型为KnobStyle
,可用值为圆形
KnobColor
- 旋钮的颜色ScaleColor
- 旋钮刻度的颜色IndicatorColor
- 当前值指示器的颜色IndicatorOffset
- 指示器在旋钮边缘后面的偏移量MinValue
- 旋钮的最小值MaxValue
- 旋钮的最大值StepValue
- 使用键盘时的步进值Value
- 旋钮的当前值
与之前的控件类似,有一些属性在设计时不可见
KnobCenter
- 控件的中心点。
事件
当状态更改时,此控件会触发一个事件来通知连接的类。此事件是
KnobChangeValue ( object sender, LBKnobEventArgs e );
事件参数的 Value
属性是旋钮的当前值。
LBSoft.IndustrialCtrls.Utils
在此命名空间中,有两个类,只有 static
成员,用于通用用途
LBColorManager
- 用于处理颜色的类LBMath
- 用于库中使用的数学函数的类
渲染器说明
现在是时候解释如何创建自定义渲染器了。任何控件都有一个基渲染器类,即默认渲染器。所有默认渲染器类都派生自 LBRendererBase
。渲染器类中绘制控件一部分的所有方法都是虚拟的,如果您想更改控件的外观,可以重写一个或所有方法。渲染器类的结构如下
控件可用的渲染器有
LBLedRenderer
-此类允许您重新设计LBLed
控件的外观,并具有以下方法DrawBackground
- 绘制控件背景的方法DrawLed
- 绘制 LED 灯的方法DrawLabel
- 绘制控件标签的方法LB7SegmentDisplayRenderer
- 此类允许您重新设计LB7SegmentDisplay
控件的外观,并具有以下方法DrawBackground
- 绘制控件背景的方法DrawOffSegments
- 绘制关闭段的方法DrawValue
- 绘制控件值的方法LBDigitalMeterRenderer
- 此类允许您重新设计LBDigitalMeterRenderer
控件的外观,并具有以下方法DrawBackground
- 绘制控件背景的方法DrawBorder
- 绘制控件边框的方法(尚未实现)LBAnalogMeterRenderer
- 此类允许您重新设计LBAnalogMeter
控件的外观,并具有以下方法DrawBackground
- 绘制控件背景的方法DrawBody
- 绘制模拟仪表主体的颜色DrawThresholds
- 绘制阈值区域的方法DrawDivisions
- 绘制刻度的方法DrawUM
- 绘制单位标签的方法(尚未实现)DrawValue
- 绘制当前值标签的方法(尚未实现)DrawNeedle
- 绘制指针的方法DrawNeedleCover
- 绘制指针盖的方法DrawGlass
- 绘制玻璃效果的方法
LBButtonRenderer
- 此类允许您重新设计LBButton
控件的外观,并具有以下方法DrawBackground
- 绘制控件背景的方法DrawBody
- 绘制控件主体的颜色DrawText
- 绘制控件标签的方法
LBKnobRenderer
- 此类允许您重新设计LBKnob
控件的外观,并具有以下方法DrawBackground
- 绘制控件背景的方法DrawScale
- 绘制旋钮刻度的方法DrawKnob
- 绘制旋钮主体的方法DrawKnobIndicator
- 绘制当前值指示器的方法
要创建自定义渲染器,请按照以下步骤操作
- 创建一个派生自基类渲染器的类(例如:
LBLedRenderer
) - 重写一个或所有方法(例如:
DrawLed
) - 在主窗体中创建自定义渲染器的实例
- 使用
Renderer
属性将渲染器设置给控件
示例
namespace TestApp
{
///
/// Class for custom renderer
///
public class LBCustomLedRenderer : LBLedRenderer
{
///
/// Draw a rectangular led
///
public virtual bool DrawLed( Graphics Gr, RectangleF rc )
{
if ( this.Led == null )
return false;
Color c = this.Led.LedColor;
SolidBrush br = new SolidBrush ( c );
Pen pen = new Pen ( c );
Gr.DrawRectangle ( pen, rc );
Gr.FillRectangle ( br, rc );
br.Dispose();
pen.Dispose();
return true;
}
}
public partial class MainForm : Form
{
private LBCustomLedRenderer myRenderer = null;
public MainForm()
{
InitializeComponent();
this.myRenderer = new LBCustomLedRenderer();
this.lbLed1.Renderer = this.myRenderer;
}
...
}
}
结论
与库的第一个版本一样,许多功能仍未实现,我希望尽快完成。任何建议/评论/反馈都非常欢迎。
对于本文,我使用了以下文章的代码和想法历史
- 1.0 (2008 年 4 月 9 日)
- 首次发布
- 2.0 (2009 年 5 月 2 日)
- 创建了一个基类
LBIndustrialCtrlBase
以派生所有控件类。 - 创建了一个基类
LBRendererBase
以派生所有渲染器类。此类有一个ILBRenderer
接口。 - 插入了两个新控件
LB7SegmentDisplay
LBDigitalMeter
- 重写了所有控件和渲染器类以使用基类
- 为 LED 定义了新的状态“
Rectangular
” - 为按钮定义了新的状态“
Rectangular
”和“Elliptical
”
- 创建了一个基类
- 2.1 (2010 年 2 月 21 日)
- 为按钮控件插入了新功能。现在按下按钮时可以接收重复事件。
- 更正了
LB7SegmentDisplay
的关闭颜色,以获得更好的可视化效果