前面談了一些觀念上的問題,這回咱們就來實作一個簡單的例子
前面談了一些觀念上的問題,這回咱們就來實作一個簡單的例子,WHS Console的程式必須要Implement Microsoft.HomeServer.Extensibility 命名空間中的IConsoleTab Interface,首先來瞭解一下這個介面的四個屬性與一個方法:
這四個屬性分別對應的主控台畫面(如下圖)的幾的位置:
如果不太瞭解這些描述,可以看前一篇 [WHS Add-in]認識Windows Home Server主控台的Console畫面
(1)TabImage | 這個屬性回傳的是將會在主控台上所顯示的Add-in選項按鍵圖形,需為32X32 Pixel |
(2)TabText | 這個屬性回傳的是將會在主控台上所顯示的Add-in選項按鍵圖形下的文字 |
(3)TabControl | 這個屬性回傳的則是add-in的實際工作面板區 |
(4)SettingGuid | 若此Add-in有相關連的ISettingTab實作,則需在此回傳其SettingTab的Guid,若無則使用 Guid.Empty |
(5)GetHelp | 按下這說明按鈕會自動呼叫GetHelp方法中的程序 |
然後來真的進入寫程式的階段,依照一個我不知道哪來的傳統 (如果有人知道這傳統怎麼來的,麻煩留言告訴我一下,在此先謝過。),第一個程式就來寫「Hello Windows Home Server」:
1. 首先開啟一個新的專案,專案類型請選擇「類別庫專案」。並加入以下組件的參考 (如果不瞭解WHS的專用組件怎麼來的,請參考 [WHS Add-in] Add-in 程式開發的準備 ):
(1) System.Drawing.dll
(2) System.Windows.Forms.dll
(3) HomeServerExt.dll
(4) Microsoft.HomeServer.SDK.Interop.v1.dll (事實上在這個範例是不會用到這個組件,不過真實狀況常會用到,所以就一併加進來)
2. 為了符合組件名稱命名原則的要求,接著在方案總管中開啟此專案的屬性,並將組件名稱設定為 HomeServerConsoleTab.Hello。
3. 建立User Control (使用者自訂控制項) ,取個無聊的名字叫「Panel_Hello」:
(1) User Control的Size屬性設為 (982,565) 。
(2) 在畫面上方建立一個 MenuStrip,BackColor 屬性設為 Transparent;RenderMode 屬性設為 ManagerRenderMode ;AutoSize 屬性設為False;GripStyle屬性設為Hidden ;Dock屬性設為Top;Size屬性設為 (982,30) 。
(3) 在MunuStrip中新增一個MenuItem,將ForeColor屬性設成白色;並將Text屬性設為 “Hello”;調整AutoSize 屬性設為False;Size屬性設為 (60,30) 。
(4) 在下方區域選個你開心的地方放一個TextBox。然後會得到一個下方圖所顯示的User Control:
在User Control中寫入以下的程式碼:
Public Class Panel_Hello
Private Sub Panel_Hello_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Clear()
End SubPrivate Sub ToolStripMenuItem_Hello_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem_Hello.Click
TextBox1.Text = "Hello Windows Home Server"
End Sub
End Class
4. 找一個你看的順眼的 32X32 像素的圖形,把它加入到你自訂的資源檔裡。
5. 重頭戲來了,在方案總管中加入一個新的類別來實做IConsoleTab,名稱定為 HomeServerTabExtender ,
(1) 先引入相關的命名空間 (當然如果你習慣用 Namespace.XXXXX 的人也可以不要引入,就是字打多一點。 )
Imports System.Windows.Forms
Imports System.Drawing
Imports Microsoft.HomeServer.Extensibility
Imports Microsoft.HomeServer.SDK.Interop.v1(2) 在Public Class HomeServerTabExtender下方加入Implement 陳述式
Implements Microsoft.HomeServer.Extensibility.IConsoleTab
(3)一加入Implements 介面後將會出現要求實做的一個方法與四個屬性:
(3-1) 先建立幾個 Private的類別內欄位,這是要用來給各個屬性回傳用的。
Private nPanel As Panel_Hello <--在建構函式中會將其設定為Panel_Hello的執行個體參考指標
(3-2) 然後要建立一個建構函式
Sub New(ByVal width As Integer, ByVal height As Integer, ByVal consoleServices As IConsoleServices)
nPanel = New Panel_Hello
nPanel.Size = New Size(width, height)
End Sub參數說明:
參數一是傳入工作區面板的寬度。
參數二是傳入工作區面板的高度。
參數三是傳入一組可以用來處理與Windows Home Server 程序的一些相關服務(參閱 IConsoleServices Interface ),未來有機會再來談這個Interface。這個建構函式是不是有其它多載存在,就我目前進行過一堆異想天開的測試後,答案是只有這一種,如果有人發現它有其它多載,麻煩請留言告訴我一下,因為SDK文件上並沒有針對建構函式有特別的說明。
(3-3)實作介面的GetHelp方法:
如果用Windows Form的觀念來比喻的話,這個方法有點類似像「設定」按鈕的事件委派函式,不過一般委派函式是沒有回傳值 (用 C#的術語來說就是 void ) ,而這個GetHelp方法是有一個Boolean的回傳值,據SDK的說法是現在這個回傳值沒啥用,就固定 Return True 就好。
Public Function GetHelp() As Boolean Implements Microsoft.HomeServer.Extensibility.IConsoleTab.GetHelp
MessageBox.Show("Hello Help!")
Return True
End Function(3-4)實作 SettingGuid 屬性
這個屬性是用來連結使用ISettingTab 介面實作的類別執行個體,目前還用不上,所以先給的 Guid.Empty。
Public ReadOnly Property SettingsGuid() As System.Guid Implements Microsoft.HomeServer.Extensibility.IConsoleTab.SettingsGuid
Get
Return Guid.Empty
End Get
End Property(3-5)實作 TabControl 屬性,回傳我們所要顯示在工作區面板的控制項。
Public ReadOnly Property TabControl() As System.Windows.Forms.Control Implements Microsoft.HomeServer.Extensibility.IConsoleTab.TabControl
Get
Return nPanel
End Get
End Property(3-6)實作 TabImage與TabText屬性,分別回傳要在WHS主控台的選單區要顯示的圖形 (也就是我們放在資源檔的那個圖) 與文字
Public ReadOnly Property TabImage() As System.Drawing.Bitmap Implements Microsoft.HomeServer.Extensibility.IConsoleTab.TabImage
Get
Return My.Resources.WHSResource.Hello2
End Get
End PropertyPublic ReadOnly Property TabText() As String Implements Microsoft.HomeServer.Extensibility.IConsoleTab.TabText
Get
Return "Hello WHS!"
End Get
End Property
整個範例程式的撰寫到這邊就算告一段落,不過要實際安裝到Windows Home Server裡,還有一些其它的程序要處理,這個我們下一篇再來解說。這個範例可以在以下連結下載 HelloWHS.zip