VB下的插件开发

VB外接程序的设计- 得到VB的控制权 VB外接程序的设计一,得到VB的控制权首先,外接,故名思意,当然必须是要和vb一起启动!在新建一外接工程后.新工程中设计器中有 Conncet.Dsr有这一元件,元件中有最为关键的一个事件 Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesigne 阅读详情
摘要 :本文从一个具体例子出发阐述了在Visual Basic 5.0环境下进行外接程序(Add-Ins)开发的原理、关键技术和注意事项,并对其相关技术,如ActiveX、多态性与接口、事件变量等VB5新引进的编程概念也做了必要的分析和描述。 
关键词:外接程序(Add-Ins),ActiveX,接口,多态,事件变量

一、 概述

Visual Basic下的Add-Ins,即外接程序,是扩展VB编程环境的非常有用的工具。作为一个开发者,我们发现在使用Visual Basic集成开发环境(IDE)时经常需要重复地干同一件简单的工作,如设置所有或一类控件的字体,前景及背景颜色,改变控件的Tab次序等。这些简单、单调而重复性的劳动如果由程序自动完成,将变得非常方便,而Add-Ins正为实现这一功能提供了可能。与Visual Basic的早期版本不同,Visual Basic5.0下的Add-Ins是一种模块化的ActiveX部件,可以作为ActiveX DLL或EXE文件进行编译。另外,跟以前的版本相比,VB5下Add-Ins无论从编程思想还是从其扩展模型的对象与结构来说,变化都比较大,因此VB5下编写Add-Ins程序与早期版本将会有很大不同。在这篇文章中,我们将从一个具体例子出发,阐述VB5下Add-Ins的编程。

 

二、 问题的提出

在Visual Basic下进行窗体设计时,我们一般希望自己的程序具有风格一致的界面,如同类控件具有相同的外观、相同的字体等。另外,我们在设计时还应该考虑到屏幕分辨率的变化对程序的影响,例如我们经常发现出现这样的问题:即在某一分辨率(如800*600)下看起来比较好的字体,当在另一分辨率下(如640*480)运行时将变得非常难看;或者在中文环境下看起来比较舒服,但在英文环境下却很不清晰。这种种原因都使得我们必须调整窗体控件的字体,以达到最佳效果。但如果表单或控件比较多时,手工调整将会非常繁琐,而且容易出错,因此编写一个Add-Ins以实现字体的自动调整将会非常实用。本文中的例子即是用来实现此功能的。

 

三、 编程方法

编写Add-Ins的最简单方法是首先利用VB5的编程模板生成一个Add-Ins的框架,然后在此框架上进一步实现自己的代码。具体方法是在VB5的“文件”菜单下选择“新建工程”,然后在弹出的窗口中选择“外接程序”(英文版中是“Add-Ins”)即可。这时VB5将生成一个名为MyAddin的工程,该工程中包括一个窗体frm AddIn,一个模块AddIn,以及一个类模块Connect。下面我们对这些部分分别做一简单分析。

1. 类模块Connect

整个类模块Connect的代码均是由模板自动生成的,大大方便了程序员编程,但其源代码中有一些比较重要的概念与方法,对我们理解VB Add-Ins甚至VB面向对象编程均有很大好处。下面我们对如下几点做一简单介绍(源代码由于是VB自动产生,这里就没有列出了)。

(1)实现IDTExtensibility接口

所有的VB外接程序都必须实现IDTExtensibility接口,该接口包含了当外接程序与Visual Basic连接时Visual Basic调用的一些方法,无论是通过外接程序管理器,还是其它一些手段。接口是VB5引入的新概念,是Visual Basic提供多态性的一种重要手段。我们知道,面向对象的语言一般都提供多态性。如C++语言,通过类的继承关系,子类重载父类的方法以实现其不同的特性,或父类仅提供方法框架,即无函数体的虚函数,而子类具体实现其代码。简单地说,多态意味着许多类可以提供同样的属性或者方法,而且调用者在调用这些属性或方法之前,不必知道某个对象属于什么类。严格来说,Visual Basic不是完整意义上的面向对象编程语言,但它也能实现多态性,不过这种多态性不是通过继承来实现的,而是通过多重ActiveX接口来提供的。多态性具体实现方法简单来说,首先是建立一个类模块,然后在该模块中声明一些子程序(Sub),但不实现其代码,这样该类模块可以说是一个抽象类,也即接口;然后建立其它的类模块,在这些类模块的声明部分中,使用Implements语句表明该类实现了上述接口,接下来就可以实现接口代码(也即接口的方法)了。这种用Implements语句的方法可以说与Java语言比较相似。至于这方面的详细信息,可参看VB的帮助或联机手册。

在类模块Connect中,使用Implements IDTExtensibility语句声明该类实现了IDTExtensibility接口。因此类模块Connect中实现了该接口包括的四个方法:OnAddInsUpdate,OnConnection,OnDisconnection,OnStartupComplete的代码,例如一条语句、过程调用、注释等等。如果过程是空的话,它会被编译器删掉。如果实在没有代码可往这些过程里加的话,就插入注释。这是因为既然实现了接口,就必须提供接口的所有方法的代码。这四种方法中,比较关键的是OnConnection和OnDisconnection方法,其中OnConnection方法当一个外接程序通过“外接程序管理器”对话框或另一个个接程序与Visual BasicIDE连接时被调用。我们一般在该方法中保存当前Visual Basic会话期实例,挂接VB菜单,工具栏,或显示初始窗口,以便用户使用该外接程序。而OnDisconnection方法当外接程序通过编程或“外接程序管理器”对话框与Visual BasicIDE分离时被调用。我们一般在该方法中卸掉菜单、工具栏、程序窗体,以及做保存设置等工作。

(2)挂接Visual BasicIDE菜单

在接口IDTExtensibility的OnConnection方法代码中,一般来说大多数情况下需要挂接Visual BasicIDE菜单(当然也可以是工具栏),以便用户可随时使用该程序。挂接菜单的代码如下:

Set MCBmenuCommandBar = AddToAddinCommandBar ("My Addin")

'sink the event

Set Me.MenuHandler=

VBinst.Events.CommandBarEvents (mcbMenuCommandBar)

其中AddToAddInCommandBar 函数的代码如下:

Function AddToAddInCommandBar (sCaption As String)As-Office.CommandBarControl

Dim cbMenuCommandBar As Office.CommandBarControl

Dim cbMenu As Object

On Error Go To AddToAddInCommandBarErr

'see if we can find the Add-ins menu

Set cbMenu=Vbinstance.CommandBars ("Add-ins")

If cbMenu is Nothing Then

'not available so we fail

Exit Function

End if

'add it to the command bar

Set cbMenuCommandBar=cbMenu.Controls.Add(1)

'set the caption

cbMenuCommandBar.Caption =sCaption

Set AddToAddInCommandBar = cbMenuCommandBar

Exit Function

AddToAddInCommandBarErr:

End Function

写上面的代码中,mcbMenuCommandBar变量定义为:

Dim mcbMenuCommandBar As Office.CommandBarControl

MenuHandler变量定义为:

Public WithEvents MenuHandler As CommandBarEvents

这里需要指出的是,MenuHandler是WithEvents变量,凡是WithEvents变量均表明该变量是一个用来响应由ActiveX对象触发的事件的对象变更。也就是说,该变量是拥有事件的,因此可以编写该变量的事件代码。在上述代码中将事件对象VBInst.Events.Comman-dBarEvents(mcbMenuCommandBar)赋予MenuHandler变量,则表示当发生有关mcbMenuC-ommandBar菜单项的事件时,由该变量的代码进行处理。在类模块中,我们发现,就存在MenuHandler-Click事件代码,该代码用以显示窗体对话。

在AddToAddInCommandBar函数中,VBInstance是在OnConnection方法保存的会话期实例,所有Add-Ins的调用都需要此实例。使用VBInstance. CommandBars(“Add-Ins”)将获得Add-Ins菜单条对象(在中文VB5下是“外接程序”菜单条),请注意:该“Add-Ins”是不会本地化的,因此无论是在中文还是英文VB5下抱歉获得上菜单条对象。代码Set cbMenuCommandBar=cbMenu.Controls.Add(1)在该菜单下添加一新的菜单项“My AddIn”,使用了cbMenu.Controls的Add方法。关于菜单条的层次关系及相应的属性及方法,可以参看VB关于外接程序的帮助或联机手册。但通过笔者的实践认为,最好的方法是使用F2打开VB的浏览器,其类之间的层次关系以及对象事件,方法,属性一目了然。

关于类Connect中的其它方面的代码,一般来说比较容易理解,这里就不叙述了。

3. 模块AddIn

模块AddIn比较简单,仅包含一个子程序:

Sub AddToINI ()

Dim ErrCode As Long

ErrCode=WritePrivateProfileString ("Add-Ins32","My AddIn.Connect","0","vbaddin.ini")

End Sub

该程序可以在立即窗口中运行,以便将关于此外接程序的信息添加到Windows目录下的vbaddin.ini文件中去,这样VB的外接程序管理器就可以认识该程序,并可将其挂接到VB的IDE环境中。该程序所做的工作很简单,只是在vbaddin.ini文件的[Add-Ins32]下添加一行My AddIn.Connect=0,表明My AddIn没有挂接到IDE环境中,若My AddIn.Connect=1,则VB启动时自动挂接该程序。

4. 窗体frm AddIn

窗体frm AddIn中的代码是由用户编写的,模板仅给出了一个框架。针对我们上面提出的具体问题,我们设计了一个简单的用户界面,包括如下控件:

(1)标签Label1:Caption="All controls In SelectedForm:"

(2)列表框List1:用于显示表单中的所有控制。

(3)命令按钮fontButton (0):Caption ="&Select Font",用于将选中的窗体上所有控制的字体设为缺省字体。(注:缺省字体为宋体9号字,这种字体在中文环境不同分辨率下效果都比较好)。

(4)命令按钮fontButton (1):Caption ="&Select Font",选择该按钮后将弹出选择字体,然后程序将选中的窗体上所有控制的字体均设为用户选择的字体。

(5)命令按钮ExitButton:Caption="&Exit",用于退出此程序,实际上的工作只是隐藏了窗体frm AddIn。外接程序的真正退出还是需要外接程序管理器中删去。

(6)通用对话框CommonDialog1:用于弹出选择字体的通用对话框,便于用户从中选择所需字体。

下面是窗体代码:

Public VBInstance As vbide.VBE

Public Connect As Connect

Dim mcmpCurrentForm As VBComponent

 

Option Explicit

Private Sub ChangeFont (NewFontName As String,NewFontSize As Integer,NewFontBold As Boolean,NewFontltalic As Boolean)

Dim control As VBControl

On Error Resume Next

List1.Clear

Set mcmpCurrentForm =VBInstance.SelectedVBComponent

If (mcmpCurrentForm.Type<>vbext-ct-VBForm) And-

(mcmpCurrentForm.Type<>vbext-ct-UseControl) And-

(mcmpCurrentForm.Type<>vbext-ct-DocObject) And-

(mcmpCurrentForm.Type<>vbext-ct-PropPage) Then

Exit Sub

End if

 

For Each control in mcmpCurrentForm.Designer.VBControls

List.AddItem control.ControlObject.Name

control.ControlObject.FontName= NewFontName

control.ControlObject.FontSize= NewFontSize

control.ControlObject.FontBole= NewFontBole

control.ControlObject.FontItalic= NewFontItalic

Next

End Sub

 

Private Sub ExitButton-Click (Index As Integer)

Connect.Hide

End Sub

 

Private Sub FontButton-Click (Index As Integer)

Select Case Index

Case 0

ChangeFont "宋体",9,False,False

Case 1

With CommonDialog1

.Flags = cdlCFBoth

.ShowFont

ChangeFont.FontName,.FontSize,.FontBold,.FontItalic

End With

End Select

End Sub

上面的代码比较简单,关键的代码在于获取屏幕上的所有控制,在Visual Basic5.0下,与早期版本不同,它利用了VBComponent对象的Designer属性获取屏幕上的设计器,它可以是窗体,也可以是ActiveX控件或ActiveX文档等,然后通过该设计器来获得设计器上的用户控制。上述代码中,首先将mcmpCurrenForm变量被设为当前选中的构件,然后判断它是否是窗体,用户控件,ActiveX文档或属性页,如果是,则获取其设计器即Designer对象,然后通过Designer对象的VBControls属性获得其上所有控制的集合,这样就可以操作该集合中的每一个VBControls控制了。对每一个控制,通过其ControlObject 属性可以获得其相应的屏幕上的控制对象,然后就可以设置该对象的任意属性了。在上述代码中,也可以使用control.Properties!Fontname取代control.ControlObject.FontName,其结果是一样的。另外,为了防止对没有Font属性的控制进行该属性设置将导致错误发生,在程序的开头使用了On Error Resume Next语句以忽略这些错误。下面是该程序的用户界面:

 

四、 进一步的改进

对上述程序还可做进一步的改进,下面列出几种改进思想及编程方案。

1、 设置控制的其它属性

上述代码主要用来设置控制的字体,但基于同样的原理,我们只要对代码稍加改变就可以设置控制的其它属性,如前景色,背景色,可见或不可见等。

2、 为当前工程中的所有窗体设置控制属性

在上述代码中,是对当前选中的窗体里的控制设置字体,但有时我们需要将工程中的所有窗体中的所有控制一次设置其属性,而不是每次选择一个窗体进行设置。这时可以采用如下方法:首先用VBE(即当前会话期实例)的ActiveVBProject属性获得当前的工程,然后通过其VBComponents属性获得当前工程中的所有组件集合,针对每一组件判断它是否为窗体或 ActiveX控件等,剩下的代码就和上面基本一样了。

3、 仅为选中的控制设置属性

若只是需要为选中的控制设置属性则可以利用VBForm 对象的SelectedVBControls属性获得当前选中的所有控制的集合,然后对其包含的控制设置属性即可。也可利用VBControl的InSelection属性判断该控制是否被选中,然后仅对选中的控制设置属性即可。

4、 当控件被添加到窗体时,自动为它设置属性

要实现当控件被添加到窗体时,自动为它设置属性的功能需要用到VBE的事件对象,即与上面提到的为菜单提供事件代码的方法一样。首先声明一个事件变量:Public WithEvents CtlHandler As VBControlsEvents,然后在接口IDTExtensibility的OnConnection方法代码中挂接控制事件处理:Set Me.CtlHandler=VBInstance.Events.VBControlsEvents (Nothing,Nothi-ng),这样就可以进行事件处理了。而进行事件处理的代码可写在CtlHandler变量的ItemAdded代码中,如下:

Private Sub CtlHandler-ItemAddec (ByVal VBControl As VBIDE.VBControl)

'这里可加入所需要的代码。

End Sub

当然,除上述改进外,我们还可以提出更多的改进方案,以丰富原程序的功能。总之,由于VB显露其IDE包括窗口、工程、控制,甚至事件、代码等各个部分的接口,使得我们能非常简单而有效地控制自己的编程活动和定制自己的界面,从而节省了编程时间,提高了工作效率,也减少了错误的发生。
VB CAD插件二次开发 Dim acadapp As AcadApplication '在窗体代码声明段定义acadapp Private Sub Command1_Click() acadapp.Documents.Add '创建新的图形文件 End Sub Private Sub Command2_Click() Dim myfilename As String Me.CommonDialog1.ShowOp 阅读详情

相关推荐

Excel插件开发过渡到VB.net中的VSTO

Com DLL基础知识  Com本质就是一个动态链接库,在windows中是靠DLL来实现的。这个DLL实现了IUnknown接口等,同时实现了 DllRegisterServer、 DllRegisterServer、 DllCanUnloadNow 、DllGetClassObject等函数。计算机为每个DLL分配一个GUI识别码,然后利用DllRegisterServer函数将Dll信息写入注册表,利用DllUnregisterServer来卸载DLL。在C、 C++中要实现一个COM组件步骤是非常繁

qq_25686631的博客 3132

最简单的插件开发教程

最简单的VB插件开发教程,是很好的资料啊

浅谈vb.net开发中使用excel插件代码

用VB.NET做excel插件开发,可能需要为excel添加自定义的工具栏。这个也是非常的简单的以下是引用片段:  Public Class ConnectClass Connect   Implements Extensibility.IDTExtensibility2   Dim app As Excel.Application   Dim wb As Excel.Workbook   D

Keep my heart quiet 2137

使用插件功能扩展VB ::来自applevb

使用插件功能扩展VB ::来自applevb 一、插件介绍   从结构上来看,一个VB插件实际上是一个COM组件,原则上组件可以使用支持COM的开发工具,例如Delphi、VC来编写。组件通过实现COM中的IDTExtensibility对象来建立与VB的连接。组件注册以后,当VB运行中在Add-In菜单中装载组件后,VB就会调用组件中IDTE...

麦壳饼 293

【VS Code插件开发】入门篇(一)

讲解了VS Code插件入门开发,讲解了项目的搭建、测试、打包、发布等一系列流程

编码世界 7万+

基于VB的多媒体播放器插件开发与实战

随着多媒体应用的不断发展,播放器的功能已不再局限于基础的音视频播放,而是向高度可扩展的插件化架构演进。VB(Visual Basic)播放器插件,作为这一趋势下的典型代表,利用VB语言结合Windows平台的COM组件技术,实现了对音频处理、界面交互等能力的灵活扩展。本章将从插件的基本定义出发,剖析其在多媒体系统中的定位与作用,并结合实际应用场景(如音频增强、频谱显示、均衡器调节等),阐述其开发背景与技术价值。

weixin_42327217的博客 918

Creating a Visual Basic Add-In (转贴、VBIDE编程的经典之作)

转贴:下面是原文地址http://podgoretsky.com/ftp/Docs/Basic/Using%20Visual%20Basic%205/ch43.htm Creating a Visual Basic Add-In Introducing add-ins VB5s Integrated Development Environment (IDE) is

cheneychao的专栏 6751

提升VB开发体验:鼠标滚轮代码窗口插件

为了恢复鼠标滚轮功能,我们可能需要深入VB IDE的扩展接口,利用这些接口添加自定义代码,以监听和响应鼠标滚轮事件。本章将介绍如何识别鼠标滚轮事件并描述事件监听的最佳实践。在下一章节中,我们将具体讨论如何通过插件实现用户体验的提升,解决鼠标滚轮功能缺失问题,以及进行功能实现的技术要点和集成测试。

weixin_28939623的博客 896

通过开发VB插件来扩展VB应用 (转)

通过开发VB插件来扩展VB应用 (转)[@more@]使用插件功能扩展VB 摘要:本文通过实例介绍如何开发一个VB的插件来扩展VB的应用。包括如何实现插件与VB开发环境的连接,控制VB开发环境,以及简要介绍插件对象的结...

csd3176的博客 191

VBDOX VB6 IDE文档注释插件开发与实践(附完整源码)

VBDOX是一个专门用于VB6(VB.NET)项目的文档生成工具,它能够根据源代码中的特定注释规则自动生成文档。它被广泛应用于软件开发文档的维护,因为它能够大幅降低维护文档与代码同步的负担。尽管VB6已经不是主流开发语言,但许多遗留系统仍然在使用中,对于这些系统文档的生成和维护,VBDOX依然具有其价值。VBDOX的输出文档通常包括项目概览、模块列表、类和方法的详细描述等,这使得VBDOX在保持与Javadoc相似功能的同时,也适合用来为遗留系统生成文档。

weixin_36311421的博客 1140

VB7/64位VB6开发工具office插件开发-twinbasic

全新的VB7,twinbasic,支持64位开发,支持EXCEL插件开发,老外连续3年闭关修练终成正果。汉化工具用法:把工具和Lang_Tool目录复制到Twinbasic安装目录。大家要每天用2小时,把问题反馈给首席设计师,把BUG都消灭掉。以后要是没人开发了,BUG也没人解决,自已最痛苦。Twinbasic论坛bug反馈,功能建议。GITHUB TB最新问题反馈。

2976

Visual Studio插件开发――VB.NET-C# 语言转换插件

该文件根据你当时创建插件工程时的不同选项,会稍有不同,有了这个文件,部署就基本搞定了。按理来所,这里根本就不要这么写的,就用else 里面代码就可以了,但是在我前段时间的中文版的Visual Studio 2005 就有问题,因为简体中文是zh-CHS ,这样它加上"Edit "就是正确的了,zh-CHSEdit, 但我的却是"zh ",所以加上"Edit "后,就成了"zhEdit ",这样就定位不到正确的资源了,如果你不知道我在说什么,你看看CommandBar.resx 文件就明白了。

biyusr的专栏 858

Excel 任务窗格插件开发实战:VB源码示例

Visual Basic (VB) 是一种历史悠久且易于学习的编程语言,最初由微软公司于1991年推出。VB是面向对象的编程语言,支持快速应用程序开发(RAD)和事件驱动编程。它允许开发者通过图形用户界面(GUI)快速构建Windows桌面应用程序。VB代码通常被编译成中间代码,并在.NET环境中运行,其中VB.NET是最新且功能丰富的版本。Visual Basic for Applications(VBA)是Microsoft Office系列应用程序中的一种编程语言。

weixin_36382073的博客 891

office插件开发_[插件开发]用VB6开发一个插件同时给32位和64位Office使用

VB6只能编译32位DLL目前已经有部分用户开始使用64位Office了用VB6给64位Office写插件将是一个痛苦的事所以很多开发者都望而却步,在没有转.net正营的前提下,都会告知用户,产品不兼容64位office此文的内容我研究了很久,用VB6开发64位Office的插件只能是进程外方案,进程内方案是不可能的但是在实现时,又有两种方式:1、ActiveX EXE大致实现如下:a.新建一个A...

weixin_39827036的博客 1116

提升VB开发效率的代码注释器插件

在软件开发中,代码注释是保持代码可读性和可维护性的关键。而VB代码注释器的出现,旨在简化这一过程。它是一个专门为Visual Basic (VB) 代码设计的工具,能够快速地为代码添加注释或移除注释,极大地提高了开发者的生产力。无论是为现有的代码块添加说明,还是在重构过程中临时取消注释以便测试,VB注释器都能迅速响应。VB代码注释器是一个旨在提高开发效率的工具,它能够快速地为代码段添加注释或取消现有注释。以下是使用VB代码注释器的基本操作步骤:选择文本:首先,通过鼠标或键盘快捷键(如。

weixin_33419305的博客 1100

一款VB6的ADDin工具,安装制作工具

一款VB6的ADDin工具,安装制作工具,能够有效帮助编程,也是学习addin编程的例子

用Visual Studio 2005 开发VB.NET-C#语言转换插件

该文件根据你当时创建插件工程时的不同选项,会稍有不同,有了这个文件,部署就基本搞定了。按理来所,这里根本就不要这么写的,就用else 里面代码就可以了,但是在我前段时间的中文版的Visual Studio 2005 就有问题,因为简体中文是zh-CHS ,这样它加上"Edit "就是正确的了,zh-CHSEdit, 但我的却是"zh ",所以加上"Edit "后,就成了"zhEdit ",这样就定位不到正确的资源了,如果你不知道我在说什么,你看看CommandBar.resx 文件就明白了。

biyusr的专栏 1005

离线安装vue脚手架,内网安装@vue/cli

公司开发环境使用内网,无法用外网,搭建环境的时候,发现内网系统没有安装vue脚手架,我搜了很多文章,发现他们的方法对我都不适用,然后就自己摸索,最终皇天不负有心人,终于被我安装上了,一下是我内网离线安装vue/cli的方法,希望能帮助到有需要的小伙伴! 因为npm被集成在nodejs中,而安装nodejs只需要把nodejs安装包copy到内网电脑安装就行,比较简单,这里就不多做演示。 在外网电脑上,使用npm install -g xxxx命令下载好我们所需要的各个安装包,比如: npm insta

Liberty_yes的博客 1万+
上一篇: 气体高压点火器
下一篇: 打不开chm文件怎么办~~
vbsourcecode
博客等级 码龄17年 19粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值