標籤:
除了商務邏輯之外,比較耗時耗力的就是人機互動了。在編寫excel定製程式的過程中,這次用到了以下幾種互動方式:
- 通過excel工作表(worksheet)擷取使用者輸入
- 通過按鈕控制項觸發功能代碼執行
- 通過TreeView控制項顯示內容摘要及導航
- 通過自訂的windows表單提供互動
工作表的操作放到後面再說,講一下按鈕控制項button和Treeview控制項的布局。
放置控制項的方法:
無非可視化放置和運行時代碼載入兩種。可視化放置比較直觀,通過visual studio的toolbox工具列拖動需要的控制項到工作表上或者自訂的windows表單上,然後可以在設計介面設定控制項的各種參數,在程式啟動時自 動載入。代碼載入則需要去msdn上尋找各種控制項開放的API介面,然後寫代碼調用API,在程式運行時由這些程式碼完成載入和參數設定。
控制項的布局:
常見的有以下幾種位置可供選擇,適用於不同情況。
- excel worksheet上
- 執行窗格action pane(文件層級自訂程式專用)
- Ribbon UI功能區(也就是excel2007上方的"開始"、"插入"菜單的位置)
另外,我們還可以在彈出的自訂windows表單在上布局各種控制項。Office UI自訂的官方介紹點擊開啟連結:http://msdn.microsoft.com/zh-cn/library/bf08984t.aspx
個人覺得執行窗格是很好用的一個布局地區,它通常位於office介面的側面,類似windows檔案夾介面左側的導覽列,優勢是地區夠大且不影響 excel工作表介面。很多文章提到自訂工作窗格custom task pane的用法,我迷糊了好久才明白這東西是給增益集add-ins用的,對應文檔級程式中的執行窗格action pane,顯示效果差不多。
1、工作表worksheet
最簡單粗暴而有效布局方式,將工作表作為放置控制項的容器,直接從控制項工具欄中拖動想要的控制項到指定的位置,然後雙擊控制項就可切換到程式碼檢視,在想要的事件中添加功能代碼即可。而且因為控制項的事件代碼是和工作表代碼一起的,訪問工作表的內容特別方便,很貼心。
比如下面的代碼響應某個按鈕的點擊,直接給按鈕所在工作表的第二行第一列的儲存格賦值,內容是當前工作表的名稱。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Cells(2, 1).value = Name
MsgBox(Name)
End Sub
這種控制項布局方式的缺點主要是幹擾了工作表介面的正常操作,與工作表隨心所欲的多變特性不般配,而且顯示效果比較醜陋。適合快速開發的小工具,簡單有效地解決業務問題即可。我最早也是將按控制項放置在工作表上,後來都移走了。
2、執行窗格action pane
執行窗格沒法在設計介面編輯,無法向其中拖動控制項,只能寫代碼來完成控制項的載入和設定。但我們可以在工程中添加一個使用者控制項(user control)或者執行窗格控制項(action pane control),這2個control控制項的作用就是作為其他控制項的容器,分別位於工程右鍵菜單的add-->new item-->windows forms和new item-->office下面。可以向他們上面拖動你想要的其他控制項,根據喜好設定好介面後,只需要用代碼把control控制項載入到執行窗格即 可,所有的內容都會自動顯示出來。
載入控制項到執行窗格的代碼如下(以工作薄workbook中載入為例):
Public Class ThisWorkbook
‘在過程外部聲明添加到工程的control控制項,作為類變數
Public actionControl As New ActionsPaneControl1
Private Sub ThisWorkbook_Startup() Handles Me.Startup
‘載入control控制項到執行窗格,ActionsPane要通過活頁簿workbook來引用
ActionsPane.Controls.Add(actionControl)
‘設定作業窗格的顯示位置為左側,注意擷取執行窗格與添加control控制項的差別
Application.CommandBars("Task Pane").Position = Microsoft.Office.Core.MsoBarPosition.msoBarLeft
End Sub
End Class
如果在worksheet代碼中添加控制項到執行窗格,需要通過Globals.ThisWorkbook.ActionsPane來引用。
:
3、Ribbon UI功能區
office2007 內建的功能入口所在的地區,幾經調整我最終把功能按鈕放在了ribbon功能區。可以通過工程右鍵菜單-->add-->new item-->office-->ribbon新增自訂Ribbon功能區(我選擇了visual designer模版)。然後就可以在設計器介面往新增的自訂功能區上添加控制項了。
修改控制項的大小:
屬性視窗-->controlSize,預設小號
修改控制項的表徵圖:
屬性視窗-->OfficeImageId,可以通過名稱關聯Office內建的表徵圖,省去了自己找表徵圖的麻煩。比如輸入FileOpen就會在運行時顯示為平時常見的開啟檔案的表徵圖。可以在微軟官網http://www.microsoft.com/en-us/download/details.aspx?id=11675下載到所有office表徵圖所對應的OfficeImageId,也就是2007 Office System Add-In: Icons Gallery。
修改功能區的位置:
屬性視窗-->position-->PositionType,預設是放在最後面,在我機器上也就是在"開發工具"功能區的後面。還可以選擇 “beforeOfficeId”和“afterOfficeId”,分別表示我們的功能區域希望放在哪個功能區的前面或後面,這時還需要輸入這個功能區 的officeId或名稱。可以在微軟官網http://www.microsoft.com/en-us/download/details.aspx?id=6627下載到所有office內建控制項的詳細情況,也就是Office 2010 Help Files: Office Fluent User Interface Control Identifiers。
這個協助文檔的內容實在太多,可以通過control Type列篩選“tab”關鍵字,可以發現這些ribbon功能區的命名規則很簡單,Tab+功能區英文名,明白這個規則後可以省去尋找的工作,比如“開 始”和“插入”功能區在excel英文版中顯示為“Home”和“Insert”,那麼我們只需要在OfficeId欄中輸入TabHome和 TabInsert即可。如果想把自訂功能區顯示在最前面,只需要選擇beforeOfficeId,然後輸入TabHome即可。
另外,VS2010的Ribbon設計器有bug,照上面的方法在介面設定beforeOfficeId和TabHome屬性之後,運行會報錯“The type ‘Microsoft.VisualStudio.Tools.Office.Ribbon.View.GenericRibbonView‘ has no property named ‘Factory‘.”。還好Msdn社區有文章說這個事,連結在此點擊開啟連結。好像是說由於vs2010在後台自動產生的ribbon介面代碼不正確,報錯位於ribbon1.designer.vb中的InitializeComponent函數內(ribbon1為添加ribbon功能區時的代碼名稱),將錯誤的語句剪下到InitializeComponent 函數的調用之後即可,比如把“Me.Tab1.Position = Me.Factory.RibbonPosition.BeforeOfficeId("TabHome")”剪下到位置。在我的工程中,這個位置就在錯誤語句的上方不遠。
<System.Diagnostics.DebuggerNonUserCode()> _
Public Sub New()
MyBase.New(Globals.Factory.GetRibbonFactory())
‘This call is required by the Component Designer.
InitializeComponent()
‘移到這裡
Me.Tab1.Position = Me.Factory.RibbonPosition.BeforeOfficeId("TabHome")
End Sub
:
Excel開發學習筆記:介面互動與控制項的布局