没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2005-03-11 10:20:00.000|阅读 1375 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
从 MSDN Code Center 下载 VBNET UserControls.exe
示例文件(英文)。请注意,程序员的注释在示例程序中是英文的,而在本文中被翻译成中文,以便更好地解释该程序。
摘要:本月 Billy Hollis 将向您介绍如何从头创建可呈现其特有界面的可视控件。
我从来没有真正想过要当一名 C++ 程序员,因为我太懒了,不能那么辛苦地工作。但我必须承认,我过去常常嫉妒那些 C++ 程序员,嫉妒他们编写可视控件的能力。
Visual Basic® 6.0 及其早期版本中的控件仅限于“复合”控件(由其他控件组成的控件),这种控件称为 UserControl。在 Visual
Basic 6.0 中编写能够在屏幕上呈现其特有可视外观的控件几乎是不可能的。
现在好了,可以使用功能强大的 Visual Basic .NET 编写各种类型的可视控件了!不仅可以编写复合的 UserControl,还能继承现有的控件(如
TextBox)并扩展其新功能。更重要的是,还可以从头编写能够呈现其特有界面的可视控件。
在本文中,我将从头创建一个完整的可视控件,以说明 Visual Basic .NET 的后一种功能。该控件是一个“红绿灯”-
一个包含三个圆(分别代表红、黄、绿三个灯)的矩形。图 1 显示各个灯亮时该控件的外观,控件的背景颜色设置为系统颜色 ControlDark。
我们称它为 TrafficLight 控件,它可以通过代码或让用户单击灯来改变亮起的灯。
因为 TrafficLight 是一个可视的 Windows 窗体控件,它将继承 System.Windows.Forms 命名空间中的 Control
类。这样,它将具有很多预定义的属性、方法和事件,包括控制其外观的属性,如 ForeColor、BackColor、Size 和 Location;还包括事件,如
MouseOver 和 Click。您可以查看 .NET 文档,获得 Control 类成员的完整列表。
红绿灯也需要具有特殊的属性和事件,如下所示:
Status 属性 |
确定亮起哪种颜色的灯。必须为以下三个枚举值之一:
|
BorderWidth 属性 | 红绿灯周围边框的宽度。 |
StatusChanged 事件 | 当通过代码或由用户单击不同的灯改变 Status 属性的值时,触发该事件。 |
由于这些成员不属于 Control
基类,所以我们需要包括完整的代码以处理它们。我们还需要绘制边框和三个相应颜色的灯的代码,以便在屏幕上绘制红绿灯。最后,我们需要处理用户单击圆以更改亮起灯的操作,并在更改亮起的灯时更改
Status 属性。
为了使本示例尽可能接近实际应用环境,我们还将包括能够确保在 Visual Studio® .NET IDE
中更好地使用控件的代码。我们为工具箱设置适当的图标,并包括能够使属性更好地与各属性窗口集成的逻辑。
现在让我们开始吧。
第 1 步:创建类型正确的项目
要创建一个保存 Windows 窗体控件的库,需要在 Visual Basic.NET 中启动一个新项目,选择 Windows Control
Library(Windows 控件库)项目类型,然后将项目命名为 MyControls。
所创建的项目实际上可以保存多个 Windows 窗体控件,每个控件都属于其各自的类,但我们只需在其中创建一个控件。
第 2 步:更改基类
在控件库中创建的类自动命名为 UserControl1,默认情况下,从 UserControl
类继承。如果我们要创建复合控件,那非常容易,只需将其他控件从工具箱中拖到设计表面上即可。
但是,由于我们要从头创建自己的控件,因此需要做一些更改。将控件类的名称从 UserControl1 更改为 TrafficLight。然后,将以下行:
Inherits System.Windows.Forms.UserControl
更改为:
Inherits System.Windows.Forms.Control
这样,使最一般的 Control 类成为基类。您会发现,不再显示可视设计表面,而是替换为组件设计表面。
为保持代码的一致性,也要将代码文件名从 UserControl1.vb 更改为 TrafficLight.vb。可以在 Solution
Explorer(解决方案资源管理器)中进行更改:右键单击代码文件的名称,并选择 Rename(重命名)。
还需要在类模块的顶部添加几行代码。将 Option Strict 设置为 On,并导入包含我们将来要用到的某些属性的命名空间。下面是要放到代码最上面的两行:
Option Strict On
Imports System.ComponentModel
第 3 步:实现属性和事件
要实现 Status 属性,首先要为可能的属性值创建枚举。将以下几行插入以 Inherits 开始的行下面:
Public Enum TrafficLightStatus statusRed = 1 statusYellow = 2 statusGreen = 3 End Enum |
此枚举是公开的,也就是说使用该控件的窗体可以访问它。
在这些行下面添加以下三行:
Dim mStatus As TrafficLightStatus = TrafficLightStatus.statusGreen Dim msngBorderWidth As Single = 1.0! Public Event StatusChanged(ByVal NewStatus As TrafficLightStatus) |
前两行中的两个变量可用于存储 Status 和 BorderWidth 属性的属性值,还为这些属性设置了默认值。保存 BorderWidth 的变量必须为
Single 类型,因为它是绘制边框所用的图形语句需要的类型。默认值中的惊叹号也表明它是 Single 类型。此集合中的最后一行声明了
StatusChanged 事件。
现在,我们为 BorderWidth 属性编写代码。在标记为 Windows Form Designer Generated Code(Windows
窗体设计器生成的代码)的代码区域下插入以下行:
<DefaultValue(1.0!), _ Description("红绿灯周围边框的宽度")> _ Public Property BorderWidth() As Single Get Return msngBorderWidth End Get Set(ByVal Value As Single) If msngBorderWidth <> Value Then msngBorderWidth = Value Me.Invalidate() End If End Set End Property |
前两行包括使该属性更好地使用 IDE 的属性。DefaultValue 特性允许在
Properties(属性)窗口中将属性值重置为默认值(操作步骤稍后介绍)。Description 特性提供选中该属性时在
Properties(属性)窗口底部显示的文本。
DefaultValue 特性还有一个技巧。如果将 TrafficLight 控件放到窗体上,并保留 BorderWidth
属性的默认值,那么窗体设计器将不生成设置属性值的代码行。这使它与其他 Windows 窗体控件没有什么区别。如果您查看典型控件(如 TextBox)的设计器生成的代码,您会发现只包括设置为非默认值的属性的代码行。我们赋予
TrafficLight 控件同样的能力。
Property Get 简单明了。Property Set
子句包括可视控件属性中常见的逻辑。设置属性时,重要的是在新属性值更改控件的外观时要能够重新绘制控件。因此,Set
子句负责确定传递的新值是否与属性中现有的值不相同。如果相同,则不执行操作。如果不同,则接受新值,然后访问控件的 Invalidate
方法。此方法表明,控件的可视区域已过期,控件需要重新绘制。
Status 属性的处理有些不同,因为它是枚举值。DefaultValue 特性没有为枚举属性提供自动重置能力。在这种情况下,DefaultValue
也无法告诉设计器何时停止设置属性值的代码。因此,Status 属性的实现中不需要 DefaultValue 特性。下面是 Status 属性的代码:
<Description("红绿灯的状态(颜色)")> _ Public Property Status() As TrafficLightStatus Get Status = mStatus End Get Set(ByVal Value As TrafficLightStatus) If mStatus <> Value Then mStatus = Value RaiseEvent StatusChanged(mStatus) Me.Invalidate() End If End Set End Property |
看起来与 BorderWidth 属性的实现类似,只有一点不同:当 Status 属性发生改变时,除了强制重新绘制控件外,还会触发 StatusChanged
事件。
要在 Properties(属性)窗口中处理属性的自动重置,我们需要使用一种特殊的方法。由于我们的属性命名为 Status,因此必须将重置方法命名为
ResetStatus。重置方法只是恢复属性的默认值。以下是其代码:
Public Sub ResetStatus() Me.Status = TrafficLightStatus.statusGreen End Sub |
为了提示设计器何时需要包括一行代码以便设置 Status 属性,我们需要包括一个名为 ShouldSerializeStatus
的方法。当属性需要一行代码时,此方法返回布尔值 True,否则,则返回 False。以下是其代码:
Public Function ShouldSerializeStatus() As Boolean If mStatus = TrafficLightStatus.statusGreen Then Return False Else Return True End If End Function
|
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号