工业控件 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的关闭颜色,以获得更好的可视化效果
 


