工业控件






4.61/5 (28投票s)
一个控件库,
引言
在我上一篇文章中,我创建了一个带有自定义渲染器的模拟仪表。现在我想为库添加更多控件,以便能够使用它来创建用于控制进程的表单或其他各种用途。
要编译此演示,您需要 .NET 2.0。可在此处下载。该项目是用SharpDevelop(一款免费的 .NET IDE)开发的。
控件说明
在此版本的库中,我包含以下类型的控件
- 可视化控件
- LED灯
- 仪表
- 命令控件
- 按钮
- 旋钮
所有控件都派生自 System.Windows.Forms.UserControl
,并且有一个可以编辑属性的类别,以及默认属性。通常所有类都有一个默认的渲染器类,用于绘制所有部分,但可以设置自定义渲染器来绘制单个部分或整个控件。
库命名空间
LBSoft.IndustrialCtrls.Leds
在此命名空间中,有用于可视化状态的模拟 LED 的控件。目前,只有一个类 LBLed。
对于此类,您可以在设计时设置以下属性
LED 属性
LedColor
- LED 的颜色。代码会修改颜色以模拟暗部。LedSize
- LED 的尺寸。您可以设置不同的宽度和高度来更改控件的外观。State
- LED 的状态。此属性的类型为LedState
,可用值为关闭
On
闪烁
LabelPosition
- 控件标签的位置。此属性的类型为LedLabelPosition
,可用值为左侧
顶部
右侧
底部
Label
- 控件的标签文本BlinkInterval
- 闪烁状态更改的间隔(以毫秒为单位)
有两个属性在设计时不可见,它们是
Renderer
- 控件的自定义渲染器。BlinkIsOn
- 闪烁状态当前状态的标志
LBSoft.IndustrialCtrls.Meters
在此命名空间中,有用于查看值的模拟(模拟或数字)仪表控件。目前,只有一个类 LBAnalogMeter。
对于此类,您可以在设计时设置以下属性
模拟仪表属性
MeterStyle
- 控件的样式。此属性的类型为AnalogMeterStyle
,可用值为圆形
BodyColor
- 控件主体的颜色。NeedleColor
- 指针的颜色ScaleColor
- 控件刻度线标记的颜色ScaleDivisions
- 刻度的主要刻度线数量ScaleSubDivisions
- 量程中一个主刻度线到另一个主刻度线之间的子刻度线数量ViewGlass
- 用于可视化玻璃效果的标志Value
- 控件的当前值MinValue
- 控件的最小值MaxValue
- 控件的最大值
有两个属性在设计时不可见,它们是
Renderer
- 控件的自定义渲染器。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
,可用值为正常
按压
与之前的控件一样,有些属性在设计时不可见
Renderer
- 控件的自定义渲染器。
事件
当状态更改时,此控件会触发一个事件来通知连接的类。此事件是
ButtonChangeState ( object sender, LBButtonEventArgs e );
事件参数的 State
属性是按钮的当前状态
LBSoft.IndustrialCtrls.Knobs
在此命名空间中,有用于更改值的模拟旋钮(类似于滑块)的控件。目前,只有一个类 LBKnob。
对于此类,您可以在设计时设置以下属性
旋钮属性
Style
- 控件的样式。此属性的类型为KnobStyle
,可用值为圆形
KnobColor
- 旋钮的颜色ScaleColor
- 旋钮刻度的颜色IndicatorColor
- 当前值指示器的颜色IndicatorOffset
- 指示器在旋钮边缘后面的偏移量MinValue
- 旋钮的最小值MaxValue
- 旋钮的最大值StepValue
- 使用键盘时的步进值Value
- 旋钮的当前值
与之前的控件一样,有些属性在设计时不可见
Renderer
- 控件的自定义渲染器。KnobCenter
- 控件的中心点。
事件
当状态更改时,此控件会触发一个事件来通知连接的类。此事件是
KnobChangeValue ( object sender, LBKnobEventArgs e );
事件参数的 Value
属性是旋钮的当前值。
LBSoft.IndustrialCtrls.Utils
在此命名空间中有两个类,仅包含用于通用用途的静态成员
LBColorManager
- 用于处理颜色的类LBMath
- 用于库所使用的数学函数的类
渲染器说明
现在是时候解释如何创建自定义渲染器了。任何控件都有一个基渲染器类,并且每个渲染器类都有一个设置控件的属性。渲染器类中的所有方法都是虚拟的,如果您想更改控件的外观,可以重写一个或所有方法。可用于控件的渲染器是
LBLedRenderer
-此类允许您重新设计 LBLed 控件的外观,并具有以下方法DrawBackground
- 绘制控件背景的方法DrawLed
- 绘制 LED 的方法DrawLabel
- 绘制控件标签的方法
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;
}
...
}
}
结论
这是该库的初始版本,许多功能尚未实现,我希望尽快实现。任何建议/评论/反馈都非常受欢迎,因为我才刚开始使用 C# 两周,我不知道我编写的代码是否是最佳实践。
对于本文,我使用了以下文章的代码和想法历史
- 1.0 (2008 年 4 月 9 日)
- 首次发布