VB外接程序的设计
一,得到VB的控制权
首先,外接,故名思意,当然必须是要和vb一起启动!在新建一外接工程后.新工程中设计器中有 Conncet.Dsr有这一元件,元件中有最为关键的一个事件 Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
这个事件中的 Application 就是VBIDE.要想控制VB,就必须从这里入手.因此在声明区就有了 Public VBInstance As VBIDE.VBE 这行代码,在这个事件中就有了 Set VBInstance = Application .然后,你的外接程序就可以直接控制整个VB.建议不要使用太长的变量名VBInstance,而使用VBI这样的短名称.编程可不是写文章.你能简短就简短.目的是完成功能,而不是让人欣赏你代码的编写艺术. ConnectMode 让会让你写的软件具备标准外接的连接方式.如果不标准,那你的代码虽然简练了很多,但是功能却让人却步.
言归正传, ConnectMode = ext_cm_External 时,那是为向导准备的.新建一个 向导,其元件Wizard中的代码就很明显,简单明了的告诉你,"被向导工具栏用来启动向导"
If ConnectMode = ext_cm_External Then
'被向导工具栏用来启动向导
LoadMe
Else
[...]
End If
当然,现在我们步创建向导,创建向导也步用操心太多,很多工作模板中已经存在了,可是有个问题我很好奇,为什么没有创建向导的向导呢,这似乎是个具有讽刺意味的事情,但是从VB6到VB.Net我似乎没听说过.
下面接着做的就是添加到VB的工具栏或菜单里了.同样工作很简单,很重要的一点,你需要声明一个响应按钮的事件对象 :
Public WithEvents evnMyCmdBar As CommandBarEvents
CommandBarEvents 只有一个事件,就是 Click .光这样声明了是没有用的.必须要在AddinInstance_OnConnection事件中:
Dim cbMyCmd as CommandBarControl
Dim cbCmd as CommnadBar
然后:
Set cbCmd = VBI.CommandBars("Tools")'Tools 是VB菜单工具这一菜单的名称.如果要加到文件菜单那就是 "File" 编辑菜单就是 "Edit" 视图彩带就是 "View",工程菜单就是 "Project".往工具条里添也成,知道名称就成,推荐个了解名称最好的方法,再调试时按暂停,再监视里添加 VBI变量,然后展开它查看,一个一个点,绝对能找到你想要的东西.
Set cbMyCmd=cbCmd.Controls.Add
添加一个 按钮
下面设置标题 cbMyCmd.Caption="这是我的按钮"
为按钮创建图标是我后来才了解到的,方法似乎很古怪.看我将要写的代码.
Clipboard.Clear '清除剪切板内容.
Clipboard.SetData LoadResPicture(102, vbResBitmap)'从资源或其它任意一种方式加载一个16*16大小的图片.
cbMyCmd.PasteFace '然后粘贴到按钮上,这个方法对象浏览器里是看不到的,完全看不到,有时候调用还会出错的.然而在这里调用保证没问题.
Clipboard.Clear'最后建议你清除一下,现在你也许明白了另外一个 问题.为什么每次启动VB前剪贴板中的内容在启动VB后会消失,或者如果你在窗体上粘贴一下,就会出现某一个VB外接程序图标.非常了不起就是这个鬼过程使得每次找到的代码先复制后打开VB然后粘贴,却什么也没有。不知道您是不是为此而头晕过哪!我想一定是的。
下面你必须要做的就是把这个按钮的事件和你在声明行里声明的时间关联起来。同样很简单:
Set Me.evnMyCmdBar = VBI.Events.CommandBarEvents(cbMyCmd)'前面 讲过了 VBI就是VBIDE.VBE对象.再次说明,创建按钮之前必须要 Set VBI= Application 这是现在所在的事件的参数之一.
到这里,如果你看明白了上面的东西的话,你的程序应该能运行了.不过别忘了如果按钮是要显示你的窗体的话,就再evnMyCmdBar事件里添入 frmName.Show .接着,VB的控制权你的程序就有了一份了!想干吗就干吗!
我可不想给你我写好的代码,如果该你了代码,你就不会仔细研究了,不仔细研究怎么能做出来外接呢!