VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 13628|回复: 21

[经验技巧] 用VB做ActiveX控件

[复制链接]
 楼主| 发表于 2007-12-25 15:13:29 | 显示全部楼层 |阅读模式
本帖最后由 icecept 于 2016-11-2 17:30 编辑

我们都知道在使用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控件.chm

462.23 KB, 下载次数: 184

 楼主| 发表于 2007-12-25 15:13:41 | 显示全部楼层

接上面:

本帖最后由 icecept 于 2009-11-16 17:52 编辑

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的基本功能都实现了,大家如果看懂了,自然就知道做复杂控件了。
郭卫的VB世界:http://hi.baidu.com/icecept
E-mail:icecept@163.com
QQ:      543375508

评分

参与人数 1威望 +3 收起 理由
yyhust + 3 楼主厚道

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2008-2-8 02:20:12 | 显示全部楼层

回复 #2 icecept 的帖子

"这里,左边是我们建立的一些元素,右边是映射到的控件和成员,我们这里对应关系如下:"----这里必须设置 interval 和 click 分别属于哪个控件和成员?我想应该都属于 user control ,可是 interval 属于哪个成员呢?该如何设置啊?就这一小步弄了我一晚上都没有搞出来啊 !!!!盼赐教!!
回复 支持 反对

使用道具 举报

发表于 2008-2-15 13:53:05 | 显示全部楼层
我写了个OCX控件,感觉就是调试麻烦
回复 支持 反对

使用道具 举报

发表于 2008-2-15 15:27:05 | 显示全部楼层
调试并不复杂,可以先把CTL文件放在一个测试项目中,最后成功后再单独生成OCX,这种方法比较好测试和修改。
回复#4 ,如果自己的控件中包含了一个TIMER控件,控件的INTERVAL映射就应该映射到TIMER控件上。
回复 支持 反对

使用道具 举报

发表于 2008-3-8 22:59:26 | 显示全部楼层
呵呵,谢谢了,现在就想看这类的资料,
你真是宋江呀
回复 支持 反对

使用道具 举报

发表于 2009-1-22 21:02:42 | 显示全部楼层
汗,chm 里竟然只是链接?而且已经失效了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-1-23 16:32:27 | 显示全部楼层

回复 #8 VBProFan 的帖子

不会啊, 我能下载下来啊。你用世界之窗浏览器或者迅雷下载试试
回复 支持 反对

使用道具 举报

发表于 2009-1-23 18:04:45 | 显示全部楼层
哦,知道了,原来不能点链接再直接点打开,而要先保存下来再打开。
回复 支持 反对

使用道具 举报

发表于 2009-2-1 11:31:53 | 显示全部楼层
学习一下~~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2019-8-19 21:51

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表