Vb6的IDE改造基本搞定了,感覺很爽,前幾天在弄DeveloperHelper的時候,一直無法理解為什麼無法將視窗放入IDE的環境中,而很多好的Add-IN確是可以放入IDE裡邊的,在MSDN和網上查閱了一些文章,終於明白了道理,現在將道理記錄一下:
(1)控制項的容器是UserDocument而不是Form。在VB的IDE環境中那些可連結的表單,其實都是一個個的UserDocument,因此,不要在Form上開發,而是要在UserDocument上開發,我也很奇怪為什麼Microsoft給的模板要是From呢,直接給好UserDocument該有多好。
(2)UserDocument的屬性設定,其實UserDocument的屬性沒有什麼特殊的要求,但是有幾點要特殊注意,一個是最好把ScrollBasr的屬性該為0,這樣就不會出現滑塊了,還有最好不要做UserDocuemtn啟動位置的設定,因為在VB的IDE裡邊所有的連結表單的啟動位置是自動記憶的,當然也包括大小,因此最好不要設定這些代碼,否則就不爽了。
(3)UserDocument的名字一定要特殊注意,因為代碼中要用到的。
(4)最關鍵的當然就是Connect裡邊的代碼編寫了,這裡邊的代碼其實是很模板化的,沒有什麼技巧,大家照著案例寫就行,關鍵代碼如下:
聲明部分:
Public FormDisplayed As Boolean
Public VbInsTance As VBIDE.VBE
Public WithEvents MenuHandler As CommandBarEvents
Public WithEvents CtlHandler As VBControlsEvents
Private mcbMenuCommandBar As Office.CommandBarControl
Private mCodeAddIn As udCodeDesign
Private mControlAddIn As udControlTemplate
Private mCodeWindow As VBIDE.Window
Private mControlWindow As VBIDE.Window
Private mCodeGuid As String
Private mControlGuid As String
Show、Hide方法:
Public Sub Hide()
On Error Resume Next
SetVisible False
End Sub
Public Sub Show()
On Error Resume Next
Set mCodeAddIn.VbInsTance = VbInsTance
Set mCodeAddIn.Connect = Me
Set mControlAddIn.VbInsTance = VbInsTance
Set mControlAddIn.Connect = Me
SetVisible True
End Sub
AddinInstance_OnConnection事件
'------------------------------------------------------
'這個方法添加增益集到 VB
'------------------------------------------------------
Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
On Error GoTo error_handler
Dim GuidHelper As New Helper.Guid
'儲存 vb 執行個體
Set VbInsTance = Application
If ConnectMode = ext_cm_External Then
'用於讓嚮導工具列來啟動此嚮導
Me.Show
Else
Set mcbMenuCommandBar = AddToAddInCommandBar("DeveloperHelper")
'吸取事件
Set Me.MenuHandler = VbInsTance.Events.CommandBarEvents(mcbMenuCommandBar)
End If
'掛接控制項管理事件
Set Me.CtlHandler = VbInsTance.Events.VBControlsEvents(Nothing, Nothing)
'將表單嵌入Vb中
If GetSetting(App.Title, "Settings", "CodeGUID", "0") = "0" Then
mCodeGuid = GuidHelper.NewGuid()
SaveSetting App.Title, "Settings", "CodeGUID", mControlGuid
Else
mCodeGuid = GetSetting(App.Title, "Settings", "CodeGUID", "0")
End If
Set mCodeWindow = VbInsTance.Windows.CreateToolWindow(AddInInst, "DeveloperHelper.udCodeDesign", "CodeDesign", mCodeGuid, mCodeAddIn)
If GetSetting(App.Title, "Settings", "ControlGUID", "0") = "0" Then
mControlGuid = GuidHelper.NewGuid()
SaveSetting App.Title, "Settings", "ControlGUID", mControlGuid
Else
mControlGuid = GetSetting(App.Title, "Settings", "ControlGUID", "0")
End If
Set mControlWindow = VbInsTance.Windows.CreateToolWindow(AddInInst, "DeveloperHelper.udControlTemplate", "ControlTemplate", mControlGuid, mControlAddIn)
If ConnectMode = ext_cm_AfterStartup Then
If GetSetting(App.Title, "Settings", "DisplayOnConnect", "0") = "1" Then
'設定這個到串連顯示的表單
Me.Show
End If
End If
Set GuidHelper = Nothing
Exit Sub
error_handler:
MsgBox Err.Description
End Sub
關鍵的代碼是這句:
Set mCodeWindow = VbInsTance.Windows.CreateToolWindow(AddInInst, "DeveloperHelper.udCodeDesign", "CodeDesign", mCodeGuid, mCodeAddIn)
文法如下:
CreateToolWindow 方法
建立一個包含指定 UserDocument 對象的新工具視窗。
文法
object.CreateToolWindow (AddInInst, ProgID, Caption, GuidPosition, DocObj) As Window
CreateToolWindow 方法的文法包含下面部分:
部分 描述
object 對象運算式 ,其值是“應用於”列表中的對象。
AddInInst 必需的。增益集執行個體變數,表示在開發環境中的增益集。
ProgID 必需的。串 表示 UserDocument 對象的 progID。
Caption 必需的。串 包括視窗標題。
GuidPosition 必需的。串 包括視窗的唯一識別碼。
DocObj 必需的。對象表示 UserDocument 對象。對象將被設定在這個函數的調用中。
記住這些基本上就差不多了,最後完成的效果如:
最終完成效果如:
在開發過程中,國內與IDE的外掛程式開發相關的資料不是很多,其實IDE的開發其實是很重要的,對公司和個人來說都是很重要的,相關的技術資料如下:
1:http://www.activevb.de/tutorials/tut_addin/addin6.html
2:http://www.mysticboy.com.cn/docs/addin/addin3.htm