65.9K
CodeProject 正在变化。 阅读更多。
Home

工业控件 2

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (131投票s)

2009年5月1日

CPOL

10分钟阅读

viewsIcon

251557

downloadIcon

30105

一个控件库,带有自定义渲染器,用于控件进程面板显示。

引言

在我上一篇文章中,我创建了这个库的第一个版本,包含基本控件和功能。现在,我想为库添加更多控件,以便能够使用它来创建控制流程的表单或出于多种原因。

要编译此演示,您需要 .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 image

对于此类,您可以在设计时设置以下属性

LED灯属性
  • LedColor- LED 灯的颜色。代码修改颜色以模拟暗部。
  • LedSize- LED 灯的大小。您可以设置不同的宽度和高度来更改控件的外观。
  • Style- LED 灯的样式。此属性的类型为 LedStyle,可用值为
    • 圆形
    • 矩形
  • State - LED 灯的状态。此属性的类型为 LedState,可用值为
    • 关闭
    • On
    • 闪烁
  • LabelPosition - 控件标签的位置。此属性的类型为 LedLabelPosition,可用值为
    • 左侧
    • 顶部
    • 右侧
    • 底部
  • Label - 控件标签的文本
  • BlinkInterval - 闪烁状态更改的间隔(以毫秒为单位)

有两个属性在设计时不可见,它们是

  • BlinkIsOn - 闪烁状态当前状态的标志

LB7SegmentDisplay

LBIndustrialCtrls_6.png

对于此类,您可以在设计时设置以下属性

显示属性
  • ShowDP - 显示或隐藏显示器的小数点
  • Value - 设置显示器的值

要更改控件的颜色,请使用 BackColor ForeColor 属性。

LBSoft.IndustrialCtrls.Meters

在此命名空间中,有模拟仪表(模拟或数字)以查看值的控件

LBDigitalMeter

LBIndustrialCtrls_7.png

对于此类,您可以在设计时设置以下属性

数字仪表属性
  • Signed - 设置显示器的符号。如果设置为 true,则显示器显示带符号的值
  • Format - 设置要显示的值的格式。此格式的一个示例是 0000.00。在此模式下,显示值与图像相同。
  • Value - 设置仪表的当前值。

LB7SegmentDisplay 类似,要更改控件的颜色,请使用 BackColor ForeColor 属性。

LBAnalogMeter

LBIndustrialCtrls_3.png

对于此类,您可以在设计时设置以下属性

模拟仪表属性
  • 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

LBIndustrialCtrls_4.png

在此命名空间中,有模拟按钮以发送命令的控件。目前只有一个类 LBButton。对于此类,您可以在设计时设置以下属性

按钮属性
  • Style - 控件的样式。此属性的类型为 ButtonStyle,可用值为
    • 圆形
    • 矩形
    • 椭圆形
  • ButtonColor - 按钮的颜色
  • Label - 按钮的标签
  • State - 按钮的状态。此属性的类型为 ButtonState,可用值为
    • 正常
    • 按压 
  • RepeatState  -  按钮的重复状态。将此状态设置为 true 时,按钮会以重复属性中设置的间隔发送事件
  • StartRepeatInterval - 第一个重复间隔(以毫秒为单位)
  • RepeatInterval - 重复间隔(以毫秒为单位)
事件

当状态更改时,此控件会触发一个事件来通知连接的类。此事件是

ButtonChangeState ( object sender, LBButtonEventArgs e );

事件参数的 State 属性是按钮的当前状态。

LBSoft.IndustrialCtrls.Knobs

LBIndustrialCtrls_5.png

在此命名空间中,有模拟旋钮以更改值的控件(类似于滑块)。目前只有一个类 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。渲染器类中绘制控件一部分的所有方法都是虚拟的,如果您想更改控件的外观,可以重写一个或所有方法。渲染器类的结构如下

LBIndustrialCtrls_8.png

控件可用的渲染器有

  • 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 的关闭颜色,以获得更好的可视化效果
© . All rights reserved.