原创:Cody
我们都知道在使用Visual Basic的时候可以使用很多现有的控件,像VB中的基本控件。然而,只有这些基本的控件在很多的时候都不能满足我们的实际需要,因此还需要更多的能够实现其他特有功能的控件。我们可以看到,在VB的部件中包含了大量的控件。这些控件包含在VB中自带的ActiveX控件库中。这些控件大大补充了VB的功能,其实可以这么说,在VB中谁掌握了对控件的使用,谁将更成功的运用VB写出功能强大的程序。在VB中不但可以使用现有的ActiveX控件,更叫人兴奋的是可以利用VB创建自己的ActiveX控件。下面我们一起讨论一下关于VB中创建ActiveX控件的基本知识。
ActiveX是Microsoft的术语,他是一组包括控件、DLL和ActiveX文档的组件,他通常是以动态连接库形势存在,因此必须在一个叫容器的可独立执行的软件中运行,比如VisualBasic,VisualC++,Internet Explorer等。因此ActiveX控件和容器必须都支持一些特定的接口协议。ActiveX应包括属性,事件和方法这些特殊机制,他也是创建ActiveX控件的核心。
从VisualBasic5.0开始,我们就可以用VB创建控件,VB6.0继承了VB5.0的开发第三方控件的能力。创建ActiveX控件有一定的步骤:
(1)确定控件将要实现的功能。这一步很重要,在这里我们应该确定控件的外观,以及它的属性、事件和
方法。
(2)通过UserControl对象设计控件的外观。
(3)将代码添加到UserControl来实现控件的外观和行为。
(4)设计控件的接口,即属性、事件和方法。
(5)创建VB的Standard.EXE工程,利用他调试制作的控件。
(6)编译控件部件,生成.ocx文件。
在这个制作步骤中我们看到要利用一个VB中的UserControl对象,他是创建ActiveX控件的基础。我先简单介绍一下UserControl对象的基本知识吧。
VB创建的ActiveX控件包括UserControl控件和构成ActiveX控件的基本控件,称为构成控件。这些基本控件实际上就是像CommandButton和Label控件等。
我们首先打开VB6.0选择ActiveX控件选项,打开后如图所示:
图1 |
其中可以看到UserControl对象的设计界面和标准工程的Form设计界面没有什么差别。我们可以直接在UserControl对象上面设计控件的外观,将代码添加在Code页面中,一切都是那么的熟悉。UserControl以普通的文本文件格式存储,该文件包含UserControl以及他的构成控件源代码和属性值。在VB中这些文件的扩展名为.ctl如果控件中用到图形元素,VB就将她存放在同名的.ctx文件中。
UserControl对象有许多的属性,事件和方法和普通的Form窗体一样。ActiveX控件的属性,方法和事件由UserControl对象的成员来实现。通过封装,这些成员对于用户来说可以是不可见的。
在VB中创建ActiveX控件有三种方法。
第一种是从零开始创建控件。
第二种是改进现有的控件。
第三种是用现有的控件组装新的控件。
在这里我将用一个非常简单的例子说明如何从零开始制作一个自己的控件。我们要做的控件是一个能显示系统时间的控件。这里是为了是从来没制作过控件的同学而准备的,在下一篇文章中我将介绍更加复杂的ActiveX控件的创建方法。
下面我们按照前面提到的创建控件的步骤进行设计:
第一步:因为我们这里设计一个显示系统时间控件,在外观上不需要多么复杂,只需一个Label来显示时
间,另外需要一个Timer来得到时间的显示间隔。
第二步:利用UserControl对象绘制控件外观。在UserControl对象的上加上一个Label,名为:Label1;
再加一个Timer控件名为:Timer1。将Timer1的Interval属性设置为1000,表示每一秒变化一次
时间。我们这是可以见到UserControl对象的属性框里的属性设置和Form是一致的。如图所示:
图2 |
第三步:我们这是就要在UserControl中添加代码了。在Timer1_Timer()过程中加入下面的代码:
Private Sub Timer1_Timer()
Label1.Caption = Time
End Sub
这时我们可以看到在Label1中显示的是系统时间。
第四步:设计控件的接口,这是最重要的地方了,我们分别为这个简单的控件加一个属性,一个事件和一个
方法,意在说明设计控件接口的方法。
(1)添加ModifyInterval属性:
在这里有必要说明一下由于我们这个控件非常简单所以不需要和Standard.EXE工程组成工程组来
测试控件,但是在创建复杂的控件时最好和标准工程组成工程组进行设计,边设计边调试,这样才会
提高制作效率。
在工具菜单中选中"添加过程"选项会弹出对话框。我们在名称里面填入ModifyInterval,在类型
里选中"属性"。如图所示:
图3 |
单击确定在代码编辑器中的自动加载的过程里添加下列代码:
Public Property Get ModifyInterval() As Variant 'Get过程获取ModifyInterval的值
ModifyInterval = Timer1.Interval
End Property
Public Property Let ModifyInterval(ByVal vNewValue As Variant)
'Let过程设置ModifyInterval的属性值
Timer1.Interval = vNewValue
PropertyChanged (ModifyInterval)
End Property
PropertyChanged()方法,它的功能是通知容器属性值已经改变,其实可以理解为当属性值改变的
时候这个方法告诉容器(存放所有属性的单元)次属性的值已经有了新的值,这时需产生一个
WriteProPerties事件,来保存新的属性值。事实上不仅是在Property Let过程中需要调用
PropertyChanged()方法,在UserControl的代码模块中无论何时改变了ActiveX控件的某个属性值,都
要调用这个方法,以保存新的属性值。
(2)添加Click事件
添加的方法和添加属性的过程一样打开工具中的"添加过程",选择事件,
在名称里填入"Click"在代码模块中添加代码:
Private Sub Label1_Click()
RaiseEvent Click
End Sub
Private Sub UserControl_Click()
RaiseEvent Click
End Sub
RaiseEvent的作用是激活Label1和UserControl的Click事件。
(3)添加一个方法TestFunction()方法同前,这里不再说明,添加代码如下:
Public Function TestFunction()
MsgBox ("Test Function Successfully!")
End Function
调用这个方法是将弹出一个对话框上面写着"Test Function Successfully!"
到这里我们已经基本完成了这个简单控件的创建,这时就要对其进行编译。打开"文件"菜单,选
择"生成DataTimer.ocx"选项存入相应路径即可
图4 |
第五步:对刚刚创建好的控件进行调试:
我们首先打开一个Standard.EXE工程在"工程"菜单中选择"部件"选项,弹出VB6.0的ActiveX控件库,
单击"浏览"找到刚刚建好的DataTime.ocx文件添加入控件库,这时会看到在库中多了"工程1"选项,把它选
中这时在控件工具箱中就会出现DataTimer控件,在Form中加入此控件,选中它,你可以在属性栏中看到我
们刚才添加的ModifyInterval属性,还可以看到DataTimer控件有Click事件。在Form中加入一个Command在
DataTimer1_Click()中添加代码:
Private Sub UserControl11_Click()
Command1.Caption = "你已经成功的使用了Click事件"
UserControl11.ModifyInterval = 1000
UserControl11.TestFunction
End Sub
执行后我们看到如图:
图5 |
到此为止,我们对控件的测试已经完成。
通过对这个控件的创建我们可以看到用VB创建ActiveX控件时非常简单的,但是我指的简单并不是说设计任何控件都是那么的简单,我指的简单是是创建方法的方便与高效。上面的例子仅仅是一个设计控件的最简单的例子,但是他具有很好的通用价值,其实再复杂的控件也是按照这个一般的步骤一点一点的设计出来的。在以后我还将用一个更加复杂的例子深入的说明ActiveX控件的制作方法。这里应该说明一下ActiveX是一组事物,包括控件,DLL和ActiveX文档,在以后的文章中我们还将学习到ActiveX文档的创建等工作。本文旨在学习在VB中创建ActiveX控件的方法。
ActiveX技术可以灵活,高效的实现交互,重用,完全分布式并与语言完全无关的各种应用。随着ActiveX技术的发展,ActiveX控件处于越来越重要的地位,那么创建一个有自己个人特色并具有特殊功能的控件将显得越来越具有现实意义。只要掌握创建ActiveX控件的基本方法就不难创建更加复杂的控件。但是ActiveX控件只依赖于Windows平台,对UNIX平台目前来说并不支持,ActiveX技术仍在不断的完善中。