VB
- 格式:doc
- 大小:527.00 KB
- 文档页数:28
第13章扩展VBVB应用程序的用户界面主要由控件构成,而在工具箱中只提供了21个标准控件。
显然,只使用这些控件编写复杂的应用程序是有困难的。
因此,有必要对VB的功能进行扩展,其途径主要有以下三种:·利用VB以及第三方开发商为用户提供的大量的ActiveX控件。
它们是VB工具箱的扩充,能够大大增强VB的编程功能。
·使用OLE技术。
可以将其他Windows应用程序的对象,如Word文档、Excel图表等插入到VB应用程序中,从而增强VB与其他应用程序共享及传输数据的能力。
·调用系统API函数。
API函数是Windows环境中可供任何Windows应用程序调用的一组函数,可以调用这些函数进行系统控制等操作。
13.1 ActiveX控件ActiveX控件是VB工具箱的扩充,在前面曾经不止一次地使用到了ActiveX控件。
本节将首先简单介绍一下ActiveX控件基础,然后重点介绍如何使用VB创建ActiveX控件。
13.1.1 ActiveX控件基础工具箱中提供了文本框、按钮等常用控件,可以直接使用,这些控件称为标准控件或内部控件。
内部控件包含在VB的EXE文件中,而ActiveX控件是一个独立的OCX文件。
在安装VB时,专业版和企业版自动将ActiveX控件安装在\Windows\System或System32目录下,并在系统注册表中进行注册。
此外,也可以使用第三方开发商开发的ActiveX控件。
至于它们的获取方式,用户可以通过互联网下载或者购买相应光盘。
注意:VB的ActiveX控件是32位控件。
而一些第三方开发商提供的ActiveX控件是16位控件,这样的控件不能在VB中使用。
使用ActiveX控件的方法与使用内部控件完全一样,只是在使用ActiveX控件前,需要将它添加到工具箱中,第3章曾经介绍过ActiveX控件的添加方法。
事实上,在前面已经多次使用到了ActiveX控件。
例如,第5章使用VB专业版和企业版都包括的Windows 公共控件(Microsoft Windows Common Controls 6.0),创建了具有Windows风格的工具栏和状态栏。
在VB中除了可以使用ActiveX控件外,还可以创建ActiveX控件,并编译成OCX文件。
一些像VB和Visual C++之类的开发工具以及像Microsoft Office之类的最终用户产品第 1 页共28 页都可以使用这些文件,在Internet上也可以使用它们。
13.1.2 创建ActiveX控件ActiveX控件的创建可以用一个与窗体类似的、称为UserControl的对象实现。
如同在窗体上利用控件构建用户界面一样,也可以在UserControl对象上放置控件以建立用户控件界面;或者使用VB的图形方法(参见第9章)来画出控件的外形。
用户控件是另一种类型的VB应用程序,已有的VB编程经验能很容易应用到创建ActiveX控件上。
建立ActiveX控件的基本过程如下:1. 确定ActiveX控件的功能。
2. 确定ActiveX控件的外观。
3. 确定控件应具有的属性、方法和事件。
4. 新建一个VB的ActiveX控件工程,设计出控件的外观。
5. 编写代码。
6. 建立一个测试工程,测试控件。
7. 将控件编译成OCX文件。
下面用一个实例来讲解如何创建ActiveX控件。
实例13.1 创建MyTime控件创建一个用于显示当前系统时间的MyTime控件,其外观如图13.1所示。
图13.1 MyTime控件的外观该控件具有以下特征:·该控件上显示一个与系统时间一起跳动的时钟。
·该控件具有Caption属性,用户可以通过该属性更改控件的标题。
·该控件具有Click事件,能响应用户的单击操作。
下面是创建MyTime控件的具体步骤。
1. 设计控件的外观(1)执行“文件”菜单中的“新建工程”命令,弹出如图13.2所示的“新建工程”对话框,从中选择工程类型“ActiveX控件”,单击“确定”按钮。
这样,在VB的工作区中就出现了一个类似于窗体的UserControl对象,如图13.3所示。
图13.2 “新建工程”对话框UserControl对象有很多与窗体类似的特征,如可以通过拖动它的边界来改变大小,也可以设置它的背景颜色等。
设计控件界面与设计普通应用程序的界面没有什么区别。
图13.3 UserControl对象设计器(2)在UserControl对象中放置一个框架控件和一个计时器控件,再在框架控件中放置一个标签控件,如图13.4所示。
其中各对象的属性设置如表13.1所示。
图13.4 MyTime控件的外观设计表13.1 MyTime控件中个对象的属性设置对象属性值UserControl 名称MyTime框架名称FrTime标签名称LabTimeAlignment 2BackColor 绿色BorderStyle 1Font 宋体、粗体、三号计时器名称Timer1Interval 1000(3)为使标签框中能动态显示出当前的系统时间,还需要编写一段代码。
双击计时器控件,打开代码窗口,编写计时器的Timer事件过程如下:Private Sub Timer1_Timer()LabTime.Caption = TimeEnd Sub在“对象”框中选择UserControl对象,单击“事件”框,在下拉列表中列出了UserControl 对象所能响应的各种事件,如图13.5所示。
从中可以看出,UserControl对象不仅能响应常见的如Click、MouseDown等事件,还有一些它特有的事件。
图13.5 UserControl对象的事件列表在“事件”框中选择InitProperties事件,编写该事件过程如下:Private Sub UserControl_InitProperties()FrTime.Caption = "现在时间"LabTime.Caption = TimeEnd Sub当控件被放置到窗体上时,UserControl对象的InitProperties事件就被触发,因此,常用该事件执行对象的初始化操作。
这里,将MyTime控件标题(即框架的Caption属性)的初始值(或默认值)设置为“现在时间”其实,到这里该控件已经具有MyTime控件的第一项功能。
在ActiveX控件的创建过程中,可随时将正在创建的ActiveX控件添加到普通窗体上测试其功能。
为此,向VB中添加一个标准工程,称其为测试工程。
2. 随时测试用户控件(1)执行“文件”菜单中的“新建工程”命令,在“新建工程”对话框中选择工程类型“标准EXE”,单击“确定”按钮。
这样,就新添加了一个标准工程,此时的工程资源管理器如图13.6所示。
其中有两个工程,一个用于创建ActiveX控件,另一个用于在创建的过程中测试ActiveX控件。
图13.6 工程资源管理器(2)将鼠标指针移到工程资源管理器中的工程2图标上,单击右键,则弹出如图13.7所示的快捷菜单,执行其中的“设置为启动”命令,就将工程2设置成了启动工程。
图13.7 工程的快捷菜单(3)在测试用户控件前,必须关闭UserControl对象的窗口。
在关闭该窗口后,在工具箱的底部就会出现新创建的ActiveX控件的图标,如图13.8所示。
图13.8 在工具箱中出现了新建的ActiveX 控件的图标(4)此时,可以像放置内部控件一样将新建的控件放置到窗体上,如图13.9所示。
选中该控件,在“属性”窗口中列出了它所具有的属性,如图13.10所示。
可见,MyTime 控件的属性很贫乏,只有Top 、Left 和Visible 等公共属性。
双击MyTime控件打开代码窗口,从它的事件列表(如图13.11所示)中可以看出,MyTime控件所能响应的事件也很少,甚至连最常用的Click 事件也没有。
图13.9 将MyTime 控件放置到窗体上图13.10 新建的控件的属性 图13.11 新建的控件所能响应的事件新建的ActiveX 控件的图标为了使MyTime控件具有设计任务中提出的第2项功能,还需要为它添加一个Caption 属性,以供用户在使用MyTime控件时,可以自行设置它的标题。
3. 添加属性(1)在工程资源管理器中双击UserControl对象,重新打开UserControl对象的窗口。
(2)打开UserControl对象的代码窗口。
(3)执行“工具”菜单中的“添加过程”命令,打开“添加过程”对话框。
(4)在“名称”文本框中输入Caption,在“类型”选项组中选中“属性”单选按钮,在“范围”选项组中选中“公有的”单选按钮,如图13.12所示。
然后单击“确定”按钮。
图13.12 “添加过程”对话框此时,在代码窗口中出现如下两个事件框架:Public Property Get Caption() As VariantEnd PropertyPublic Property Let Caption(ByVal vNewValue As Variant)End Property用户可以切换到测试窗体(记住首先要关闭UserControl对象的窗口),会发现在MyTime控件的属性窗口中多了一个Caption属性。
但现在设置这个属性没有任何效果,还需要为出现在代码窗口中的两个事件过程编写一些代码。
(5)无论何时设置Caption属性,都将执行Property Let过程,因此,可以编写Property Let过程如下:Public Property Let Caption(ByVal vNewValue As Variant)'将用户在Caption属性中设置的值赋给框架的Caption属性FrTime.Caption = vNewValue'通知Caption属性值已更改PropertyChanged "Caption"End Property无论何时读取Caption属性赋值,都将执行Property Get过程,因此,可以编写Property Get过程如下:Public Property Get Caption() As VariantCaption = FrTime.CaptionEnd Property通过Property Let过程和Property Get过程,就可以使MyTime控件的标题与它的Caption属性始终保持一致。
(6)切换到测试窗体,设置MyTime控件的Caption属性为“当前时刻”,可见,控件的标题被更改了,如图13.13所示。
图13.13 设置MyTime控件的Caption属性(7)关闭窗体,再次打开窗体,会发现控件的标题又恢复了初始的内容。