VB.docx
- 文档编号:11562085
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:34
- 大小:371.42KB
VB.docx
《VB.docx》由会员分享,可在线阅读,更多相关《VB.docx(34页珍藏版)》请在冰点文库上搜索。
VB
第13章扩展VB
VB应用程序的用户界面主要由控件构成,而在工具箱中只提供了21个标准控件。
显然,只使用这些控件编写复杂的应用程序是有困难的。
因此,有必要对VB的功能进行扩展,其途径主要有以下三种:
·利用VB以及第三方开发商为用户提供的大量的ActiveX控件。
它们是VB工具箱的扩充,能够大大增强VB的编程功能。
·使用OLE技术。
可以将其他Windows应用程序的对象,如Word文档、Excel图表等插入到VB应用程序中,从而增强VB与其他应用程序共享及传输数据的能力。
·调用系统API函数。
API函数是Windows环境中可供任何Windows应用程序调用的一组函数,可以调用这些函数进行系统控制等操作。
13.1ActiveX控件
ActiveX控件是VB工具箱的扩充,在前面曾经不止一次地使用到了ActiveX控件。
本节将首先简单介绍一下ActiveX控件基础,然后重点介绍如何使用VB创建ActiveX控件。
13.1.1ActiveX控件基础
工具箱中提供了文本框、按钮等常用控件,可以直接使用,这些控件称为标准控件或内部控件。
内部控件包含在VB的EXE文件中,而ActiveX控件是一个独立的OCX文件。
在安装VB时,专业版和企业版自动将ActiveX控件安装在\Windows\System或System32目录下,并在系统注册表中进行注册。
此外,也可以使用第三方开发商开发的ActiveX控件。
至于它们的获取方式,用户可以通过互联网下载或者购买相应光盘。
注意:
VB的ActiveX控件是32位控件。
而一些第三方开发商提供的ActiveX控件是16位控件,这样的控件不能在VB中使用。
使用ActiveX控件的方法与使用内部控件完全一样,只是在使用ActiveX控件前,需要将它添加到工具箱中,第3章曾经介绍过ActiveX控件的添加方法。
事实上,在前面已经多次使用到了ActiveX控件。
例如,第5章使用VB专业版和企业版都包括的Windows公共控件(MicrosoftWindowsCommonControls6.0),创建了具有Windows风格的工具栏和状态栏。
在VB中除了可以使用ActiveX控件外,还可以创建ActiveX控件,并编译成OCX文件。
一些像VB和VisualC++之类的开发工具以及像MicrosoftOffice之类的最终用户产品都可以使用这些文件,在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.1MyTime控件的外观
该控件具有以下特征:
·该控件上显示一个与系统时间一起跳动的时钟。
·该控件具有Caption属性,用户可以通过该属性更改控件的标题。
·该控件具有Click事件,能响应用户的单击操作。
下面是创建MyTime控件的具体步骤。
1.设计控件的外观
(1)执行“文件”菜单中的“新建工程”命令,弹出如图13.2所示的“新建工程”对话框,从中选择工程类型“ActiveX控件”,单击“确定”按钮。
这样,在VB的工作区中就出现了一个类似于窗体的UserControl对象,如图13.3所示。
图13.2“新建工程”对话框
UserControl对象有很多与窗体类似的特征,如可以通过拖动它的边界来改变大小,也可以设置它的背景颜色等。
设计控件界面与设计普通应用程序的界面没有什么区别。
图13.3UserControl对象设计器
(2)在UserControl对象中放置一个框架控件和一个计时器控件,再在框架控件中放置一个标签控件,如图13.4所示。
其中各对象的属性设置如表13.1所示。
图13.4MyTime控件的外观设计
表13.1MyTime控件中个对象的属性设置
对象
属性
值
UserControl
名称
MyTime
框架
名称
FrTime
标签
名称
LabTime
Alignment
2
BackColor
绿色
BorderStyle
1
Font
宋体、粗体、三号
计时器
名称
Timer1
Interval
1000
(3)为使标签框中能动态显示出当前的系统时间,还需要编写一段代码。
双击计时器控件,打开代码窗口,编写计时器的Timer事件过程如下:
PrivateSubTimer1_Timer()
LabTime.Caption=Time
EndSub
在“对象”框中选择UserControl对象,单击“事件”框,在下拉列表中列出了UserControl对象所能响应的各种事件,如图13.5所示。
从中可以看出,UserControl对象不仅能响应常见的如Click、MouseDown等事件,还有一些它特有的事件。
图13.5UserControl对象的事件列表
在“事件”框中选择InitProperties事件,编写该事件过程如下:
PrivateSubUserControl_InitProperties()
FrTime.Caption="现在时间"
LabTime.Caption=Time
EndSub
当控件被放置到窗体上时,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所示。
新建的ActiveX控件的图标
图13.8在工具箱中出现了新建的ActiveX控件的图标
(4)此时,可以像放置内部控件一样将新建的控件放置到窗体上,如图13.9所示。
选中该控件,在“属性”窗口中列出了它所具有的属性,如图13.10所示。
可见,MyTime控件的属性很贫乏,只有Top、Left和Visible等公共属性。
双击MyTime控件打开代码窗口,从它的事件列表(如图13.11所示)中可以看出,MyTime控件所能响应的事件也很少,甚至连最常用的Click事件也没有。
图13.9将MyTime控件放置到窗体上
图13.10新建的控件的属性图13.11新建的控件所能响应的事件
为了使MyTime控件具有设计任务中提出的第2项功能,还需要为它添加一个Caption属性,以供用户在使用MyTime控件时,可以自行设置它的标题。
3.添加属性
(1)在工程资源管理器中双击UserControl对象,重新打开UserControl对象的窗口。
(2)打开UserControl对象的代码窗口。
(3)执行“工具”菜单中的“添加过程”命令,打开“添加过程”对话框。
(4)在“名称”文本框中输入Caption,在“类型”选项组中选中“属性”单选按钮,在“范围”选项组中选中“公有的”单选按钮,如图13.12所示。
然后单击“确定”按钮。
图13.12“添加过程”对话框
此时,在代码窗口中出现如下两个事件框架:
PublicPropertyGetCaption()AsVariant
EndProperty
PublicPropertyLetCaption(ByValvNewValueAsVariant)
EndProperty
用户可以切换到测试窗体(记住首先要关闭UserControl对象的窗口),会发现在MyTime控件的属性窗口中多了一个Caption属性。
但现在设置这个属性没有任何效果,还需要为出现在代码窗口中的两个事件过程编写一些代码。
(5)无论何时设置Caption属性,都将执行PropertyLet过程,因此,可以编写PropertyLet过程如下:
PublicPropertyLetCaption(ByValvNewValueAsVariant)
'将用户在Caption属性中设置的值赋给框架的Caption属性
FrTime.Caption=vNewValue
'通知Caption属性值已更改
PropertyChanged"Caption"
EndProperty
无论何时读取Caption属性赋值,都将执行PropertyGet过程,因此,可以编写PropertyGet过程如下:
PublicPropertyGetCaption()AsVariant
Caption=FrTime.Caption
EndProperty
通过PropertyLet过程和PropertyGet过程,就可以使MyTime控件的标题与它的Caption属性始终保持一致。
(6)切换到测试窗体,设置MyTime控件的Caption属性为“当前时刻”,可见,控件的标题被更改了,如图13.13所示。
图13.13设置MyTime控件的Caption属性
(7)关闭窗体,再次打开窗体,会发现控件的标题又恢复了初始的内容。
为了使Caption属性能保存用户设置的属性值,还需要编写如下两个过程:
PrivateSubUserControl_WriteProperties(PropBagAsPropertyBag)
PropBag.WriteProperty"caption",Caption,"现在时间"
EndSub
PrivateSubUserControl_ReadProperties(PropBagAsPropertyBag)
FrTime.Caption=PropBag.ReadProperty("Caption","现在时间")
EndSub
WriteProperties过程在窗体关闭或保存文件时发生。
PropertyBag对象就像一个保存属性的口袋,它的WriteProperty方法有3个参数,第1个参数是所要保存的属性,第2个参数是属性的值,第3个参数是属性的默认值。
在保存属性前,先将当前属性值与默认值作比较,如果相同,则不必保存,因为控件加载时会自动装入默认值。
如果存在原先保存的属性值,则ReadProperty方法将返回该属性值,否则返回默认值。
这样,就为MyTime控件添加了一个Caption属性。
下面再为MyTime控件添加一个事件。
4.添加事件
为控件添加事件较简单,步骤如下:
(1)在UserControl对象的代码窗口的声明段添加以下代码:
PublicEventClick()
也可以通过“添加过程”对话框来自动添加。
(2)编写标签和框架的Click事件过程如下:
PrivateSubLabTime_Click()
RaiseEventClick'引发MyTime的Click事件
EndSub
PrivateSubFrTime_Click()
RaiseEventClick'引发MyTime的Click事件
EndSub
这样,就为MyTime控件添加了一个Click事件,当使用该控件时,用户就可以根据需要编写它的Click事件过程。
(3)切换到测试窗体,打开它的代码窗口,在其中编写MyTime控件的Click事件过程如下:
PrivateSubMyTime_Click()
MyTime.Caption="正点时刻"
Print"单击时刻"&Time
EndSub
运行程序后,窗体如图13.14所示。
单击MyTime控件,则它的标题改变为“正点时刻”,同时在窗体上显示出单击控件的时刻,如图13.15所示。
图13.14启动程序后的效果图13.15单击MyTime控件后的效果
5.添加属性页
我们知道,对于ActiveX控件,除了可以在“属性”窗口中设置属性外,还可以通过它的属性页设置属性,并且显得更直观。
例如,在前面创建工具栏、状态栏以及通用对话框时,都使用到了控件的属性页。
有了向导的帮助,为ActiveX控件创建属性页变得非常容易。
具体步骤如下:
(1)执行“工程”菜单下的“添加属性页”命令,则弹出如图13.16所示的对话框。
在其中选中“VB属性页向导”选项,单击“打开”按钮,弹出如图13.17所示的“介绍”对话框。
图13.16“添加属性页”对话框
图13.17“介绍”对话框
(2)单击“下一步”按钮,弹出如图13.18所示的“选择属性页”对话框,用来设置属性页内的选项卡。
单击“添加”按钮,弹出如图13.19所示的“属性页名称”对话框,在其中输入MyTime后,单击“确定”按钮,MyTime就出现在列表中。
图13.18“选择属性页”对话框
图13.19“属性页名称”对话框
(3)在“选择属性页”对话框单击“下一步”按钮,弹出如图13.20所示的“添加属性”对话框。
在“可用属性”列表中列出了已创建的Caption属性,选中它后单击“向右箭头”按钮将它添加到属性页中。
图13.20“添加属性”对话框
(4)单击“下一步”按钮,弹出如图13.21所示的“完成”对话框,单击“完成”按钮后即可完成属性页的创建。
图13.21“完成”对话框
可以发现,在工程资源管理器中多了属性页文件夹,双击新创建的MyTime属性页,可打开属性页的设计窗口,如图13.22所示。
图13.22属性页窗口
这就是向导自动创建的属性页界面。
用户也可以在属性页的设计窗口中调整各组件的布局,更改属性的设置,例如,将标签上显示的Caption换成中文“名称”两个字。
切换到测试窗体中,将鼠标指针移到MyTime控件上,单击右键,执行快捷菜单中的“属性”命令,即可打开新创建的属性页对话框,如图13.23所示。
在这里设置Caption的属性与在“属性”窗口中设置的效果完全相同。
图13.23为MyTime控件设计的属性页
13.1.3编译Mytime控件
在ActiveX控件创建完成后,必须将其编译成OCX文件,以后才能在VB中或其他支持ActiveX控件的应用程序中使用它。
编译控件的步骤如下:
(1)将鼠标指针移到工程资源管理器中的控件工程(工程1)上,单击右键,执行弹出菜单中的“工程属性”命令,打开如图13.24所示的“工程属性”对话框,在“工程名称”文本框中输入“MyTime控件”。
在将ActiveX控件编译成OCX文件后,这个名称将出现在“部件”对话框中。
图13.24“工程属性”对话框
(2)单击“确定”按钮,关闭对话框。
(3)执行“文件”菜单中的“生成MyTime控件.ocx”命令,则弹出如图13.25所示的“生成工程”对话框,选择保存位置和名称后,单击“确定”按钮,系统就开始编译OCX文件。
图13.25“生成工程”对话框
新建一个标准EXE工程,执行“工程”菜单中的“部件”命令,则弹出如图13.26所示的“部件”对话框,在“控件”列表中按控件名称的次序列出了当前系统中的所有ActiveX控件。
拖动滚动条查看控件列表,可以发现在其中列出了新创建的MyTime控件,选中该控件,单击“确定”按钮即可将其添加到工具箱中,之后可以像使用其他控件一样来使用MyTime控件。
图13.26“部件”对话框
13.2VB与OLE
OLE(ObjectLinkingandEmbedding,对象链接与嵌入)使VB应用程序可以访问Windows环境中其他应用程序的对象,例如Word文档、Excel工作表等,这类对象称为OLE对象。
VB能够访问的OLE对象取决于用户系统所安装的Windows应用程序。
OLE对象可以通过VB工具箱中提供的OLE控件放置在VB应用程序中。
13.2.1使用OLE控件
OLE控件位于工具箱中,它的作用是在VB应用程序中插入OLE对象,就像一个容器一样,因此有时又称它为OLE容器控件。
这里给出一个使用OLE控件插入OLE对象的实例。
在OLE控件中既可以插入整个文件,也可以只插入文件的部分内容。
插入整个文件
将OLE控件放置在窗体上,与放置其他控件不同的是,此时会弹出一个“插入对象”对话框,如图13.27所示。
图13.27“插入对象”对话框
选中“从文件创建”单选按钮,单击“确定”按钮,则弹出如图13.28所示的对话框。
。
图13.28从文件中创建对话框
在“文件”文本框中直接输入插入对象的文件名,或单击“浏览”按钮,在弹出的“浏览”对话框(如图13.29所示)中选择一个文件。
图13.29“浏览”对话框
如果选中了“链接”复选框,则表示对象的插入方式是链接,否则是嵌入。
链接对象和嵌入对象有很大的不同,在下一节将专门介绍,请读者注意其区别。
在默认情况下,在OLE控件中显示的是插入对象的具体内容。
如果选中“显示为图标”复选框,则插入的对象在OLE控件中显示为一个图标。
此时,“插入对象”对话框如图13.30所示,其中显示了将在OLE控件中显示的图标,用户也可以通过单击“更改图标”按钮来更改图标。
单击“确定”按钮即可将所选的对象插入到OLE控件中。
如图13.31所示的是将一个Word文档插入到OLE控件中,其中a图是未选中“显示为图标”复选框的情形,b图是选中“显示为图标”复选框的情形。
图13.30选中“显示为图标”选项
(a)(b)
图13.31在OLE控件中插入Word文档
在设计阶段,可以随时在窗体的OLE控件上单击右键,在弹出的快捷菜单(如图13.32所示)中执行“插入对象”命令,也可以通过打开“插入对象”对话框来插入对象。
图13.32OLE控件的快捷菜单
一个OLE控件中只能放置一个OLE对象,如果OLE控件中已经插入了一个对象,再执行插入对象操作时就会弹出如图13.33所示的消息框,单击“是”按钮,则原有的对象将被删除,同时插入一个新的对象。
图13.33消息框
插入文件的部分内容
如果只想在OLE控件中插入文件的部分内容,如Word文档中的某段文本,那么可以通过“选择性粘贴”对话框来实现。
步骤如下:
(1)打开要插入部分内容的文件。
例如,要插入某Word文档中的某段文本,则在Word应用程序中打开该文档。
(2)将要插入的内容复制到剪贴板中。
(3)切换到VB中,在窗体的OLE控件上单击右键,执行快捷菜单中的“特殊粘贴”命令,即可打开“选择性粘贴”对话框,如图13.34所示。
图13.34“选择性粘贴”对话框
(4)单击“确定”按钮即可将所选内容插入到OLE控件中。
如果选中“粘贴”单选按钮,则表示插入的方式是嵌入;如果选中“粘贴链接”单选按钮,则表示插入的方式是链接。
13.2.2链接对象与嵌入对象
链接和嵌入的不同之处在于插入到OLE控件的对象所存放的位置不同。
当一个对象被链接到应用程序时,只是插入了该对象的地址,而不是对象本身。
对象本身仍然由创建它的应用程序管理,存储在OLE控件之外。
在调用对象时,是根据地址访问数据源的,如果数据源中的数据变化了,则应用程序所调用的数据也随之变化;如果数据源移动了位置、更改了名称或遭到破坏,在VB应用程序中都将不能正确调用它。
当一个对象被嵌入到应用程序时,插入的是真正的数据,数据随VB应用程序一起存储,因此,嵌入对象可能会大大增加文件的大小。
可见,链接与嵌入各有优缺点。
链接方式虽然占用较小的空间,但数据容易受到外界的影响而丢失;嵌入方式下数据不易丢失,但会占用较多的空间。
图13.35中(a)图所示的是在两个OLE控件中分别嵌入和链接同一个Word文档后的情形,在Word应用程序中将文档的最后一行文本删除,以嵌入方式插入文档的OLE控件中的内容丝毫没有改变,而以链接方式插入文档的OLE控件中的内容却随Word文档一起改变了,如图13.35中(b)图所示。
(a)(b)
图13.35链接与嵌入
程序运行时,在默认情况下,通过双击OLE对象就可以激活它。
对于以链接方式插入的对象,双击它则启动创建该对象的应用程序并打开对象;对于某些以嵌入方式插入的对象,双击它则创建该对象的应用程序的菜单出现在窗体上,如图13.36所示的是Word菜单显示在VB应用程序的窗体上的情形,用户就可以像在Word环境中一样编辑文档。
图13.36激活OLE对象
13.2.3OLE控件的属性
通过设置OLE控件的属性,可以更改对象的插入方式、确定对象在OLE控件中的显示方式等。
还可以在代码中使用OLE控件的属性或方法在运行时插入对象。
表13.2中列出了OLE控件的常用属性。
表13.2OLE控件的常用属性
属性
说明
Class
确定在OLE控件中插入的对象的类。
在“属性”窗口中选中该属性,单击其右侧出现的按钮,则打开如图13.37所示的“选定类”对话框,其中列出了系统中可用的类名。
例如,要插入Word文档,需要指定类名为WordDocment.8
DisplayType
确定对象在OLE控件中的显示方式。
取值为0表示显示对象的内容,取值为1则表示显示对象的图标
OLETypeAllowed
确定OLE控件所能支持的对象的插入方式。
值为0表示链接,值为1表示嵌入,值为2表示两者都可以
SizeMode
确定OLE控件如何显示对象,其取值及含义如表13.3所示
SourceDoc
设置或返回插入对象的文件名
图13.37“选定类”对话框
表13.3SizeMode属性的取值
属性值
说明
0
按对象的实际尺寸显示,超出OLE控件的部分被截掉,如图13.38所示
1
对象自动调整大小以适合OLE控件,如图13.39所示
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB