建造 ActiveX 控件的三种方法

以下是 Visual Basic 中创建控件的三种模式:

第二种和第三种模式是相似的,因为它们都需要把子控件放到 UserControl 对象上。不过,每种模式都有自己的特殊要求。

制作用户绘制的控件

如果由零开始写控件,那么可以制作任意外观和接口的控件。只需在 Paint 事件中添加代码来绘制控件。如果单击控件后其外观改变了,那就是代码进行了绘制的缘故。

如果要创建新的可视部件,例如要求单击按钮后按钮被击碎并销毁,则应选用这个模式。

详细信息 关于创建用户绘制控件的将在本章后面的“绘制控件”中深入讨论。

改进现有的控件

改进现有的控件就是把一个控件实例放到 UserControl 设计器上,并添加自己的属性、方法和事件。

您可随意指定改进控件的接口。对于初始控件的属性、方法和事件,只有当决定显露它们时才需要把其包含在接口中。

本章后面部分的“显露子控件的属性”描述了怎样用手工做这件事,以及如何使用“ActiveX 控件接口向导”使工作变得简单。

改进现有控件的外观比改进接口难,因为要改进的控件有自己的绘制代码,并且绘制的行为可能取决于 Windows 的消息或其它事件。

有经验的 Windows 程序员可以使用《部件工具指南》中的“使用 Windows API”所描述的使用 AddressOf 操作符把子控件归为子类。这就允许某些控件可以改变原来的外观,但没有方法来改变控件的绘制代码。

使用控件的内嵌绘制功能来增强控件是相当容易的,而通过添加属性、方法和事件,或者截收并改变现有的属性和方法,则是比较困难的。本章后面的“绘制控件”部分将对此进行深入讨论。

将几个现有的控件组装成新的控件

在 UserControl 设计器上组装现有的若干控件可以迅速地构造出控件的外观和接口。

例如,在“创建一个 ActiveX 控件”中分步讨论、并由 CtlPlus.vbg 示例程序中提供的 ShapeLabel 控件,它使用 Shape 控件来提供可视的背景色,使用 Label 控件来显示标题。

图 9.3 和图 9.4 说明了多个子控件是怎样对 ActiveX 控件的外观和接口起作用的。

图 9.3 子控件提供 ShapeLabel 的外观

子控件只需出现在 UserControl 设计器上即可对控件实例的外观起作用。它们通过委派来对控件的接口起作用,如图 9.4 所示

图 9.4 子控件对 ShapeLabel 的接口的作用。

例如,下面的代码说明了如何把 ShapeLabel 的 Caption 属性委派给子控件的 Caption 属性 lblCaption

Public Property Get Caption() As String
   Caption = lblCaption.Caption
End Property

Public Property Let Caption(NewCaption As String)
   lblCaption.Caption = NewCaption
   PropertyChanged "Caption"
End Property

详细信息 本章后面的“绘制控件”和“显露子控件的属性”将更加深入地探讨控件组装。PropertyChanged 的作用和重要性将在“在控件中添加属性”中讨论。