[WHS Add-in] 實作 IConsoleTab (1) -- 撰寫程式

前面談了一些觀念上的問題,這回咱們就來實作一個簡單的例子

      前面談了一些觀念上的問題,這回咱們就來實作一個簡單的例子,WHS Console的程式必須要Implement Microsoft.HomeServer.Extensibility 命名空間中的IConsoleTab Interface,首先來瞭解一下這個介面的四個屬性與一個方法:

iConsoleTab_member480_2

這四個屬性分別對應的主控台畫面(如下圖)的幾的位置:

如果不太瞭解這些描述,可以看前一篇 [WHS Add-in]認識Windows Home Server主控台的Console畫面

Console480
(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:

WHS_UserControl

在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 Sub

    Private 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 Property

Public ReadOnly Property TabText() As String Implements Microsoft.HomeServer.Extensibility.IConsoleTab.TabText 
        Get 
            Return "Hello WHS!" 
        End Get  
End Property

    整個範例程式的撰寫到這邊就算告一段落,不過要實際安裝到Windows Home Server裡,還有一些其它的程序要處理,這個我們下一篇再來解說。這個範例可以在以下連結下載 HelloWHS.zip