《制作ActiveX控件》由会员分享,可在线阅读,更多相关《制作ActiveX控件(29页珍藏版)》请在金锄头文库上搜索。
1、制作ActiveX控件Stillwatersrundeep.流静水深流静水深,人静心深人静心深Wherethereislife,thereishope。有生命必有希望。有生命必有希望14.1.1ActiveX控件的制作过程(1)新建工程时选择新建“ActiveX控件”,打开如图14-1所示的UserControl对象的设计控件界面。(2)在UserControl1对象上添加可能得到的各种对象。(3)编写程序代码。(4)参考类的创建,为控件添加属性、事件和方法。(5)如果需要,可以为控件建立属性页。(6)建立一个标准的EXE工程测试所建立的ActiveX控件。(7)编译成OCX文件发布。14.1
2、制作ActiveX控件图14-1ActiveX控件的设计窗口下面以建立一个“图片浏览器”控件为实例,说明ActiveX控件的制作过程。图片浏览器控件由驱动器列表框、目录列表框、文件列表框和图片框四个控件组成。1、新建ActiveX控件工程单击“文件”菜单中的“新建工程”,打开“新建”对话框,双击“ActiveX控件”,弹出如图14-1所示ActiveX控件的设计窗口。根据需要将工程名称换名,如改为“AcdSystem”,则“AcdSystem”就是在“部件”对话框中显示的新的ActiveX控件的名称。在“AcdSystem”工程的设计窗口有一个UserControl1对象,其功能类似于标准EX
3、E工程的窗体,是ActiveX控件的设计平台,可以在其中添加各种已有对象以及编写事件过程。通过单击“工程”菜单中的“添加用户控件”可以在一个ActiveX控件工程中制作多个ActiveX控件,这样在生成的OCX文件中就有多个ActiveX控件。表14-1UserControl1对象的主要属性属性说明PropertyPages回或设置字符串,该字符串是与控件关联的属性页的名称Public决定控件是否可以由其他应用程序共享InvisibleAtRuntime决定控件是否可以在运行时可见ToolboxBitmap设置控件在工具箱中的图案表14-2UserControl1对象的主要事件事件说明Init
4、ialize当控件被建立时触发Terminate当控件被从内存删除时触发InitProperties创建对象的新实例时,发生该事件,一般在该事件过程中设置界面属性的初始值ReadProperties当加载具有保存状态的对象的旧实例时,发生该事件WriteProperties当保存对象的实例时,发生该事件。该事件通知对象此时需要保存对象的状态,以便将来可恢复该状态。大多数情况下,对象的状态仅包括属性值EnterFocus当焦点进入控件时,发生该事件ExitFocus当焦点离开控件时,发生该事件2.设计ActiveX控件界面按图14-2设计界面,即添加四个控件:驱动器列表框Drive1、目录列表框
5、Dir1、文件列表框File1和图片框Picture1,将UserControl1对象的Name属性设置为ACDSee,以后在其他窗体上添加该控件时,控件的默认名称将以ACDSee开头。如需要可以为UserControl1对象的ToolboxBitmap属性任意指定一个图形文件。图14-2 “图片浏览器”控件3.编写代码PrivateSubDrive1_Change()当在驱动器列表框选择新的驱动器时Dir1.Path=Drive1.Drive目录列表框的路径改变EndSubPrivateSubDir1_Change()目录列表框的路径改变时File1.Path=Dir1.Path文件列表框的
6、路径改变EndSubPrivateSubCombo1_Click()File1.Pattern=Trim(Right(Combo1.Text,5)文件类型为列表框的后5个字符EndSubPrivateSubFile1_Click()Picture1.Picture=LoadPicture(File1.Path+File1.FileName)EndSubPrivateSubUserControl_Initialize()File1.Pattern=*.bmp;*.tif;*.tiff;*.jmp;*.jpg;*.jpeg;*.gifEndSub4.建立测试工程(1)单击“文件”菜单中的“新建工程
7、”,新建一个标准EXE工程,将新建的工程改名为TextAcdPRJ。(2)单击“工程资源管理器”中的“TextAcdPRJ”工程名称,在弹出的快捷菜单中选择“设置为启动”,将TextAcdPRJ工程设置为启动工程。参见图14-3。(3)必须关闭ActiveX 控件设计窗口,才能在工具箱中可以看到如图14-4所示新建的ActiveX 控件图标(右下角),这样才能在测试窗口添加该ActiveX 控件。(4)在TextAcdPRJ工程的窗口添加ACDSee控件,可以将该控件的默认名称ACDSee1改为TestACDSee。此时如果打开ACDSee控件的设计窗口,意味着ACDSee控件处于设计阶段,T
8、extAcdPRJ工程的窗口将布满斜线,参见图14-5。 图14-3设置启动窗体 图14-4 ACDSee控件图标 图14-5 布满斜线的测试窗体5.为控件添加事件对使用ActiveX控件的用户来说,其中的UserControl1对象和该对象上的子控件的事件、属性是不可见的,而ActiveX控件的事件和属性对用户是可见的。VB自动为ActiveX控件提供了GotFocus、LostFocus、DragDrop、DragOver和Validate事件。另外,ActiveX控件的设计者可以为ActiveX控件自定义事件。以为ACDSee控件设计一个PictureDblClick事件为例(该事件在双
9、击ACDSee对象上的图片框时发生),说明自定义事件的过程。(1)声明事件打开ACDSee控件的设计窗口,在代码窗口的通用声明部分加上如下声明:EventPictureDblClick()(2)在ACDSee对象上的图片框双击事件过程中适当位置加上触发事件的代码:PrivateSubPicture1_DblClick().其他代码RaiseEventPictureDblClickEndSub这样,关闭ACDSee控件设计窗口后,在测试窗口的TestACDSee控件的事件组合框中可以看到PictureDblClick事件,根据需要,可以在其中加上所需事件代码,如:PrivateSubTestAC
10、DSee_PictureDblClick()Myanswer=MsgBox(你想放大图片吗?,vbYesNoCancel)EndSub6.为控件添加属性如为控件增加Drive属性的步骤为:(1)打开ActiveX 控件设计窗口的代码窗口。 (2)单击“工具”菜单中的“添加过程”,打开“添加过程”对话框,输入属性名“Drive”,过程类型为“属性”,范围为“公有的”。这样,VB立即提供如下两个过程模板:Public Property Get Drive() As VariantEnd PropertyPublic Property Let Drive(ByVal vNewValue As Var
11、iant)End Property在这两个过程中添加所需代码:Public Property Get Drive() As StringDrive = Drive1.DriveEnd PropertyPublic Property Let Drive(ByVal New_Drive As String)Drive1.Drive = New_DriveEnd Property这样,就将UserControl对象子控件Drive1的Drive属性显露出来,关闭ActiveX 控件设计窗口,在属性窗口可以看到Drive属性,参见图14-6(Drive的默认值设置为“c:”。在程序运行时,在驱动器列表
12、中选择的驱动器就是ActiveX 控件的Drive属性值。采用类似的方法可以将UserControl对象子控件Dir1的Path属性和子控件File1的FileName属性显露出来。参见图14-6(已将Path的默认值设置为“c:效果图”)。图14-6ActiveX控件的属性7.保存属性值在UserControl对象中有三个与属性访问密切相关的事件:InitProperties事件、ReadProperties事件和WriteProperties事件。属性保存在称为“属性包”、类型为PropertyBag的对象中,可以通过调用“属性包”的WriteProperties方法和ReadProper
13、ties方法来保存和读取属性值。如读取Drive、Path、FileName属性的过程代码为:PrivateSubUserControl_ReadProperties(PropBagAsPropertyBag)Drive1.Drive=PropBag.ReadProperty(Drive,c:)Dir1.Path=PropBag.ReadProperty(Path,c:效果图)File1.FileName=PropBag.ReadProperty(FileName,)EndSub保存Drive、Path、FileName属性的过程代码为:PrivateSubUserControl_WriteP
14、roperties(PropBagAsPropertyBag)CallPropBag.WriteProperty(Drive,Drive1.Drive)CallPropBag.WriteProperty(Path,Dir1.Path)CallPropBag.WriteProperty(FileName,File1.FileName)EndSub虽然在WriteProperties事件中加上了保存属性的代码,但WriteProperties事件并不知道属性值何时发生了改变,可以调用PropertyChanged方法来通知VB控件的某个属性值发生了改变,然后通知WriteProperties事件保
15、存新的属性值。如:PublicPropertyLetDrive(ByValNew_DriveAsString)Drive1.Drive=New_DrivePropertyChangedDriveEndProperty8.设计属性页下面以为AcdSee控件建立MyPropertiesPage属性页为例,说明建立新属性页的步骤:(1)按照前面的介绍为AcdSee控件添加新的属性,这些属性要对应到新的属性页MyPropertiesPage中。这里不添加新的属性,只将现有属性Drive、Path对应到MyPropertiesPage属性页中。(2)单击“工程”菜单中的“添加属性页”,打开“添加属性页”
16、对话框,可利用“VB属性页向导”方便地创建属性页,双击“VB属性页向导”打开“属性页向导”对话框。(3)单击“下一步”按钮,当出现图14-9所示对话框时,单击“添加”按钮,打开图14-10所示“属性页名称”对话框,输入属性页名称“MyPropertyPage”,单击“确定”按钮返回。(4)单击“下一步”按钮,出现图14-11所示“属性页向导-添加属性”对话框,在“可用属性”框中显示可以在新的属性页中添加的属性名称,依次双击“Drive”和“Path”,将其添加到右边的“MyPropertyPage”属性页中。(5)单击“完成”按钮完成属性页的创建。此时在工程资源管理器窗口可以看到新的属性页图标
17、。关闭控件设计窗口,在测试窗口打开控件的属性页,参见图14-12。 图14-7 “连接属性页”窗口 图14-8 标准属性页 图14-9 添加属性页 图14-10 输入属性页名称 图14-11 添加属性 图14-12 MyPropertyPage属性页9.发布ActiveX控件制作ActiveX控件的设计和测试完毕后,应发布ActiveX控件,以便在其他VB应用程序方便地使用。在控件设计窗口下单击“文件”菜单中的“生成MyAcdSystem.ocx”,即可生成相应的OCX文件以供发布。由于VB创建的ActiveX控件需要VB运行时的DLL文件以及ActiveX控件中子控件的支持文件,最好使用安装
18、向导来生成ActiveX控件的安装程序,以确保发布所有必须的支持文件。14.1.2使用向导创建ActiveX控件步骤为:(1)按照上面介绍的方法创建用户界面,编写用户代码。(2)选择“外界程序”菜单中的“外界程序管理器”,打开“外界程序管理器”对话框,选中“VB6ActiveX控件接口向导”,选中“加载行为”的“在启动中加载”项加载“ActiveX控件接口向导”。(3)选择“外界程序”菜单中的“ActiveX控件接口向导”,开始运行ActiveX控件接口向导。在图14-13中将“可用名称”中的Drive、Path和FileName属性移到右边的“选定名称”中。单击图14-14中的“新建”按钮,
19、打开“添加自定义成员”对话框,输入所要自定义事件的名称PictureDblClick,选中“事件”类型。 图14-13 “选定接口成员”对话框 图14-14 “创建自定义接口成员”对话框在图14-15所示“设置映射”对话框中,在“公有名称”栏内依次选择需要映射到控件的成员(属性、事件或方法),然后在“映射”栏内选择映射到的控件和控件的成员。如将PictureDblClick事件映射到Picture1的DblClick双击事件。如果存在没有设置映射关系去的成员,则单击“下一步”按钮时会出现“设置属性”对话框,要求用户设置属性值。图14-16中的“TestProperty”属性即在图14-14中添
20、加的属性,没有设置映射对象,在该对话框可以为其设置属性默认值。 图14-15 “设置映射属性”对话框 图14-16“设置属性”对话框下面以引用MicrosoftWord对象库为例说明在VB中使用外部应用程序中的对象的步骤为:(1)单击“工程|引用”,打开如图14-15所示的“引用”对话框,设置对要使用的对象所在的对象库的引用,即选中“MicrosoftWord10.0ObjectLibrary”。(2)使用下列方法之一创建新的对象1)使用New关键字DimMynewDocumentAsNewDocument定义对象变量并创建新的Word文档2)使用CreateObject函数DimMynewD
21、ocumentAsObjectSetMynewDocument=CreateObject(word.application)3)使用GetObject函数获取其他应用程序中已经存在的对象DimMynewDocument2AsObjectSetMynewDocument2=GetObject(C:aaa.doc)(3)使用新创建的对象的属性、方法和事件编程(4)释放外部变量可以单击F2功能键打开对象浏览器来了解引用对象的属性、方法和事件。要了解某个成员,可以选中该属性后单击F1功能键打开“MicrosoftVisualBasic参考”帮助文件。14.2使用其他应用程序中的对象图14-17 “引用
22、”对话框表14-3WordDocument对象的常见属性和方法属性说明示例Range属性返回一个Range对象,该对象代表指定对象所含的部分文档ActiveDocument.Paragraphs(1).Range.Style=wdStyleHeading1Text属性可用于Range或Selection对象,返回或设置指定区域或所选内容中的文本。ActiveDocument.Range.Text=第一章Visible属性决定是否显示对象或对象的格式ActiveDocument.Application.Visible=TrueApplication属性返回一个Application对象,该对象代
23、表MicrosoftWord应用程序ActiveDocument.Application.Visible=TrueCheckSpelling方法开始对指定的文档或区域进行拼写检查。如果该文档或区域中包含错误,则本方法显示“拼写和语法”对话框ActiveDocument.Range.CheckSpellingClose方法本示例在关闭活动文档前提示用户保存该文档ActiveDocument.CloseQuit方法退出MicrosoftWord,并可选择保存或传送打开的文档ActiveDocument.Application.Quit表14-4WordApplication对象的常见属性和方法属性
24、说明示例或格式Documents属性返回一个Documents集合,该集合代表所有打开的文档Documents.OpenFileName:=C:FilesDoc.doc,ReadOnly:=TrueAdd方法将一个新的空文档添加到一个已经打开的文档集合中Documents.AddSelect方法选定指定对象Documents.Add.SelectVisible属性决定是否显示对象或对象的格式ActiveDocument.Application.Visible=TrueActiveDocument属性返回一个Document对象,该对象代表活动文档。如果没有打开的文档,就会导致出错ActiveD
25、ocument.PrintOutShapes属性该属性返回Shapes集合,该集合代表指定文档、页眉或页脚中的所有Shape对象SetmyDoc=Documents.AddmyDoc.Shapes.AddShapemsoShapeRectangle,5,25,100,50AddTextEffect方法创建一个“艺术字”对象,并返回表示新的“艺术字”对象的形状对象expression.AddTextEffect(PresetTextEffect,Text,FontName,FontSize,FontBold,FontItalic,Left,Top,Anchor)Selection属性返回一个Se
26、lection对象,该对象代表一选定的范围或插入点IfSelection.Type=wdSelectionNormal_ThenMsgBoxSelection.TextShapeRange属性该属性返回ShapeRange集合,该集合代表所选内容或区域中的所有Shape对象selection.ShapeRange.Shadow.Type=msoShadow6TextEffect属性该属性返回一个TextEffectFormat对象,该对象包含指定图形的文本效果格式属性PresetTextEffect属性返回或设置指定“艺术字”的样式Copy方法将指定对象拷贝到剪贴板Selection.Copy
27、Quit方法退出MicrosoftWord,并可选择保存或传送打开的文档ActiveDocument.Application.Quit说明:(1)AddTextEffect方法在AddTextEffect方法的语法格式中,expression表达式返回一个Shapes对象。PresetTextEffect预设的文本效果,为MsoPresetTextEffect常量,其值对应于“艺术字库”对话框中所列的格式。Text为“艺术字”中的文字。Left和Top分别为“艺术字”图形左边缘和上边缘相对于锁定标记的位置,以磅为单位。Anchor为锁定标记。向文档添加“艺术字”时,“艺术字”的宽度和高度将根据
28、指定文字的大小和数量自动地进行设置。例:在活动文档中添加包含文字“艺术字体”的“艺术字”,然后将该“艺术字”锁定到第一段。PrivateSubNewTextEffect()ActiveDocument.Shapes.AddTextEffectPresetTextEffect:=msoTextEffect11,Text:=_艺术字体,FontName:=ArialBlack,FontSize:=36,FontBold:=msoTrue,_FontItalic:=msoFalse,Left:=1,Top:=1,Anchor:=ActiveDocument.Paragraphs(1).RangeEn
29、dSub(2)Shapes属性该属性返回Shapes集合,该集合代表指定文档、页眉或页脚中的所有Shape对象。该集合可以包含图形、形状、图片、OLE对象、ActiveX控件、文本对象和标注。Shapes属性应用于文档时将返回文档正文中的所有Shape对象,不包括页眉和页脚。当Shapes属性应用于HeaderFooter对象时,Shapes属性返回文档中所有页眉和页脚中的Shape对象。例:新建一篇文档,为其添加一个矩形,该矩形宽150磅,高50磅,并设置矩形的左上角距页面左边缘10磅,距页面左上角25磅。SetmyDoc=Documents.AddmyDoc.Shapes.AddShape
30、msoShapeRectangle,10,25,150,50(3)TextEffect属性该属性返回一个TextEffectFormat对象,该对象包含指定图形的文本效果格式属性。应用于代表“艺术字”的Shape或ShapeRange对象以及InlineShape对象。例:myDocument文档中的图形1为“艺术字”,将图形1的字体样式设为粗体。PrivateSetmyDocument=ActiveDocumentWithmyDocument.Shapes(3)If.Type=msoTextEffectThen.TextEffect.FontBold=TrueEndWith例14-1:下面的
31、实例程序的功能是:单击“检查拼写错误”按钮时打开一个已有Word文件“C:TestVBWord.doc”,并将文档复制到新建的另一个文档中,检查其中的拼写错误,如果存在拼写错误,则打开图14-18所示“拼写”对话框,关闭该对话框后返回应用程序界面。单击“创建艺术字”按钮时,启动另一个Word应用程序,在其中创建艺术字,并复制到窗口的图片框中。DimmyNewDocument1AsNewDocument定义一个WordDocument对象PrivateSubCommand1_Click()单击“检查拼写错误”按钮DimmyNewDocument2AsObject定义一个对象变量SetmyNewD
32、ocument2=GetObject(C:aaa.doc)设置对象变量的值为Word文档C:aaa.docmyNewDocument1.Range.Text=myNewDocument2.Range.Text将文档C:aaa.doc的内容复制到myNewDocument1ActiveDocument.Paragraphs(1).Range.Style=wdStyleHeading1将myNewDocument1中的第一段格式设置为“标题1”myNewDocument1.Application.Visible=True显示myNewDocument1界面myNewDocument1.Range.
33、CheckSpelling开始拼写检查AppActivateCaption激活本应用程序EndSubPrivateSubCommand2_Click()单击“创建艺术字”按钮DimmyNewWordAsObjectSetmyNewWord=CreateObject(word.application)myNewWord设置为Word应用程序对象myNewWord.Documents.Add.Select选定myNewWord的文档中的内容myNewWord.ActiveDocument.Shapes.AddTextEffect(15,艺术设计,华文彩云,22#,-1,0,180,50).Sele
34、ct设置艺术字体myNewWord.Selection.ShapeRange.TextEffect.FontName=华文彩云重置艺术字字体myNewWord.Selection.ShapeRange.TextEffect.PresetTextEffect=6重置艺术字样式myNewWord.Visible=True显示应用程序界面myNewWord.Selection.Copy复制艺术字至剪贴板Picture1=Clipboard.GetData()将艺术字粘贴到图片框中EndSubPrivateSubForm_Unload(CancelAsInteger)关闭应用程序窗口DimintResponseAsIntegerintResponse=MsgBox(Doyouwanttosavealldocuments?,vbYesNo)显示消息对话框IfintResponse=vbYesThen退出Word前以Word格式保存文档ActiveDocument.Application.QuitSaveChanges:=wdSaveChanges,OriginalFormat:=wdWordDocumentEndIfEndSub 图14-18 拼写对话框 图14-19 单击“创建艺术字”按钮后的界面