从头创建 Visual Basic .NET 控件 (四)

visual|创建|控件

第 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

时间: 2024-10-30 19:59:19

从头创建 Visual Basic .NET 控件 (四)的相关文章

从头创建 Visual Basic .NET 控件 (八)

visual|创建|控件 第 7 步:生成和测试控件现在 TrafficLight 控件的设计就完成了.选择 Build | Build MyControls(生成 | 生成 MyControls),以创建最终的控件库. 要测试控件,我们需要一个 Windows 窗体项目.您可以在其他解决方案中执行此操作,但在开发控件所用的解决方案中执行会更容易.从菜单中选择 File | Add Project | New Project(文件 | 添加项目 | 新项目).选择 Windows Applica

从头创建 Visual Basic .NET 控件 (六)

visual|创建|控件 第 5 步:使控件响应用户要允许用户更改灯的颜色,必须检测到用户的鼠标单击操作.有经验的 Visual Basic 开发人员都知道,可以使用多种方法实现这一目的.我们使用最简单的一种方法,即检测 MouseUp 事件.下面是检测用户单击并更改 Status 属性以与之匹配的代码: Private Sub TrafficLight_MouseUp(ByVal sender As Object, _                     ByVal e As System

从头创建 Visual Basic .NET 控件 (二)

visual|创建|控件 现在让我们开始吧. 第 1 步:创建类型正确的项目要创建一个保存 Windows 窗体控件的库,需要在 Visual Basic.NET 中启动一个新项目,选择 Windows Control Library(Windows 控件库)项目类型,然后将项目命名为 MyControls. 所创建的项目实际上可以保存多个 Windows 窗体控件,每个控件都属于其各自的类,但我们只需在其中创建一个控件.

从头创建 Visual Basic .NET 控件 (三)

visual|创建|控件 第 2 步:更改基类在控件库中创建的类自动命名为 UserControl1,默认情况下,从 UserControl 类继承.如果我们要创建复合控件,那非常容易,只需将其他控件从工具箱中拖到设计表面上即可. 但是,由于我们要从头创建自己的控件,因此需要做一些更改.将控件类的名称从 UserControl1 更改为 TrafficLight.然后,将以下行:     Inherits System.Windows.Forms.UserControl 更改为:     Inh

从头创建 Visual Basic .NET 控件 (七)

visual|创建|控件 第 6 步:清理为了使控件顺利地运作,我们还需要执行一些其他操作.例如,大小改变时需要重新绘制控件.而且,为了不改变控件的比例,我们需要检测影响大小的属性发生更改的时间,然后强制宽度等于高度的三分之一.下面是完成这两项任务的事件处理程序: Private Sub TrafficLight_Resize(ByVal sender As Object, _                 ByVal e As System.EventArgs) Handles MyBase

从头创建 Visual Basic .NET 控件 (五)

visual|创建|控件 第 4 步:绘制控件的外观要使控件具有一个可视的外观,我们需要在 Paint 事件中放置逻辑.然后,每次控件需要刷新其可视外观时,就会运行该逻辑. Windows 窗体中的 Paint 逻辑使用 .NET 中 GDI+ 部分中的类.这些类基本上包括了 Windows API 图形功能.由于适合 .NET,所以比 API 更易于使用.但是,有关它们的工作原理,需要理解以下几点. 在 Windows API 中,图形操作需要一个窗口句柄,有时称为 hWnd.在 GDI+ 中

Visual Basic CommandButton控件

使用CommandButton控件 命令按钮控件被用来启动.中断或结束一个进程.单击它时将调用已写入Click 事件过程中的命令. 大多数Visual Basic应用程序中都有命令按钮,用户可以单击按钮执行操作.单击时,按钮不仅能执行相应的操作,而且看起来就象是被按下和松开一样,因此有时称其为下压按钮. 详细信息 关于CommandButton控件的简单示例,请参阅第三章,"窗体.控件和菜单"中的"单击按钮执行操作". 向窗体添加命令按钮 在应用程序中很可能要使用一

扩展Visual Editor的控件和属性

扩展 Visual Editor 的控件和属性 Visual Editor for Java 是基于 eclipse 的 GUI 可视化编辑插件,该插件以 Java 代码为中心,实现了所见即所得的用户界面编辑方式,广泛支持目前的 SWT.AWT.Swing 等控件包.本文通过一个完整的对 Visual Editor 的扩展示例,向读者展示扩展 Visual Editor 的控件和属性的方法. 背景 Visual Editor for Java 实现了基于 Java 源代码的所见即所得的用户界面开

qt中如何根据类名动态创建qt默认的控件类实例

问题描述 qt中如何根据类名动态创建qt默认的控件类实例 7C 需要根据从外部读取类名来创建类的实例,类大多为qt自带的控件类,如QWidgetQLineEdit等.有没有不用继承这些类就可以动态创建的方法? 解决方案 int id = QMetaType::type(""MyClass"");if (id != 0) {void *myClassPtr = QMetaType::construct(id);...QMetaType::destroy(id myCl