用VB做ActiveX控件
我们都知道在使用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控件的核心。
在这个制作步骤中我们看到要利用一个VB中的UserControl对象,他是创建ActiveX控件的基础。我先简单介绍一下UserControl对象的基本知识吧。
VB创建的ActiveX控件包括UserControl控件和构成ActiveX控件的基本控件,称为构成控件。这些基本控件实际上就是像CommandButton和Label控件等。
UserControl对象的设计界面和标准工程的Form设计界面没有什么差别。我们可以直接在UserControl对象上面设计控件的外观,将代码添加在Code页面中,一切都是那么的熟悉。UserControl以普通的文本文件格式存储,该文件包含UserControl以及他的构成控件源代码和属性值。在VB中这些文件的扩展名为.ctl如果控件中用到图形元素,VB就将她存放在同名的.ctx文件中。
UserControl对象有许多的属性,事件和方法和普通的Form窗体一样。ActiveX控件的属性,方法和事件由UserControl对象的成员来实现。通过封装,这些成员对于用户来说可以是不可见的。
在这里我将用一个非常简单的例子说明如何从零开始制作一个自己的控件。我们要做的控件是一个能显示系统时间的控件。这里是为了是从来没制作过控件的同学而准备的,在下一篇文章中我将介绍更加复杂的ActiveX控件的创建方法。
1、创建一个ActiveX控件工程
  在“文件”选单中选择“新建工程”,然后双击“ActiveX控件”图标,生成一个控件工程项目(缺省名UserControl1)。此时设计窗口显示一个类似于窗体的界面(无边框),其属性窗口也类似于窗体的属性窗口,只是有很多熟悉的属性没有了,且还有一些一般
窗体不具有的属性。选取“工程选单”最下面的“UserControl1属性”项,在出现的对话框中改工程名称为“MyControl”。在属性窗口中改控件名称为“MyTime”。
到这里,就初步建立好了一个active控件工程。然后,我们来设计界面,我们加入一个timer(timer1)控件和一个label 控件,将timer1的“Interval”属性为1000,然后在Timer1_Timer()过程中加入如下代码:
lblTime.Caption = Time 'Time 返回系统当前时间
现在将工程保存一下。由于控件工程不能独立运行,我们创建一个新的工程来测试一下设计的新控件。
选取“文件”选单上的“添加工程”,注意不要用“打开工程”或“新建工程”,那样会关闭控件工程。创建一个“Standard exe”工程,并将控件工程的设计窗口关闭,这时会发现在控件工具栏的最下边出现了一个名为“MyTime”的新控件。将其放至Form1窗体内,窗体上会出现一行文字,显示的正是当前时间,这就是新创建的MyTime的实例“MyTime1”。然后把我们后来加的那个工程设置为启动工程,这样,按F5运行看看效果吧。到这里,我们就初步实现了一个最基镜腶xtive控件。下面我们介绍一些高级的东西。
2、添加属性
为我们的控件添加Interval属性,使的我们可以设置timer的间隔。步骤如下:
选择菜单“工程”》添加用户控件》vb Axtivex控件界面向导,然后点击打开按钮,在出现的界面中单击
下一步,出现如下界面:
这里左边显示的是可用的属性,右边显示的是所有已经选择的属性。我们先把右边的全部删除,然后在左边的“Interval”,双击添加道右边,单击下一步。出现如下的界面:
上一个界面显示的是在你的自定义控件中那写控件已经有的属性,例如interval是timer控件有的。而这里可以加那些控件没有的,我么这里加一个TimeFormat属性,用来控制日期的显示格式。单击增加,在名称中输入TimeFormat,在类型中选择属性。单击确定。
然后用同样的方法新建一个GetTime方法和一个click事件,之后图如下:
之后单击下一步,出现如下界面:
这里,左边是我们建立的一些元素,右边是映射到的控件和成员,我们这里对应关系如下:
设置好了之后,单击下一步,就出现如下界面:
这里列出了我们自定义的属性和方法,那些系统的属性和我们自定义的事件不在这里显示。在上面的界面中,我们可以对我们刚才定义的属性:TimeFormat属性设置类型,默认值和运行时或则是设计时可改变与否,相信大家都看得懂。我们这里把类型设置为String,默认值为“hh-mm-ss",运行时为Read/Write,设计时为Read/Write。设置好了之后单击完成。
然后可以在MyTime的代码窗口中看到程序为我们增加了一些代码。
这时,属性interval可以使用,但是,我们自己定义的属性TimeFormat并未生效,我们把Timer1_Timer过程改成如下:
If Me.TimeFormat <> "" Then
Label1.Caption = Format(Time, Me.TimeFormat)
Else
Label1.Caption = Time
End If
改好之后,你在form1中把MyTime1的TimeFormat属性设置为:hh时mm分ss,在看看时间的显示吧。
也可以改变inteval属性来改变时间改变的间隔
如果我们双击Mytime1空间,可以看到,他有click事件。
Private Sub MyTime1_Click()
End Sub
控件的使用下面我们来分析以下click的原理:
我们会发现代码窗口中“通用”项下出现如下代码:
  Option Explicit
  Public Event Click()
  大家也许能够看得出来,在这里只是定义了两个名称,它们和鼠标的Click毫无关系,下面的代码就把它们联系起来。
Private Sub UserControl_Click()
RaiseEvent Click
End Sub
Private Sub Label1_Click()
RaiseEvent Click
End Sub
RaiseEvent的功能是把控件或其上的子控件的事件进行转发,因为控件总是由其它的子控件组成,上面的代码的意思是:当你单击用户控件时,就出发控件的click事件,当label单击时,也出发。
  现在关闭控件设计窗口,打开测试工程,在MyTime1的过程列表中,发现多了事件Click,点击Click,添加代码如下:
Private Sub MyTime1_Click()
MyTime1.Interval = 3000
Debug.Print "Interval的值为:" & MyTime1.Interval
End Sub
  运行测试工程,点击窗口中显示的时间,会在立即窗口中输出刚设定的Interval属性值是3000。
最后,我们刚才建立的方法还不能使用,我们现在来实现。可以看到,我们刚才的步骤完成好后,控
件的代码窗口中自动加了如下代码:
Public Function GetTime() As String
End Function
我们改成如下:
Public Function GetTime() As String
GetTime = Time '返回当前时间,这里只是举例,大家可以加入其他的复杂代码
End Function
然后我们在测试工程中加入一个按钮(command1)在他的click事件中加入下面代码:
Private Sub Command1_Click()
MsgBox MyTime1.GetTime
End Sub
然后运行,单击按钮看看效果。
到这里,我们把active的基本功能都实现了,大家如果看懂了,自然就知道做复杂控件了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。