本次準備的教育訓練,除了全面介紹Visio的相關知識和概念,還以實戰開發的方式加深Visio二次開發的知識掌握,另外還通過試題來考核各個學生的掌握情況,本文主要是介紹我根據自己一直以來的Visio開發經驗所得,準備的Visio二次開發試題,并提供相應的解答分析,希望大家批評指正,一起溝通交流。
雖然Visio已經在各行各業應用的很廣,不過這兩年來關注的部落格文章,Visio二次開發方面的文章除了我零星寫的一些,其他同行基本上沒有文章涉及(可能是沒有時間寫這方面經驗),雖然目前已經很少從項目上去升華、研究Visio二次開發方面的工作(除非又有一些特殊的項目合作需要)。是以,如果這方面我自己有一些新的心得或者資料,我是很樂意和大家一起分享。
一)判斷題(每題5分,共20題,總分100分)
1)部署Visio二次開發的應用程式不需要安裝Office Visio。
答案:錯,開發、部署都需要。
2)Visio的“以開發人員模式運作”模式,能幫助我們檢視更多、更細的Visio圖元的資訊。
答案: 對。
3)形狀資料視窗顯示的字段資訊,是Visio圖元内部固定的資料,不能通過代碼進行更改。
答案:錯,可以通過代碼修改,增加、修改、删除均可。
4)通過宏錄制功能,可以檢視某個功能的具體實作代碼,也能實作對圖元(Shape對象)等對象屬性的調試跟蹤。
答案:對。
5)可以通過Visio來實作模具的繪制,修改,調整其内部相應的控制内容,但模具顯示的圖示不可修改。
答案:錯,圖示也一樣可以修改。
6)Visio Drawing Control控件是一個COM控件,該控件除了提供界面顯示Visio文檔外,也提供了Visio二次開發中涉及到的Window、Document、Shape、Page、Selection等對象的事件處理。
7)Visio文檔裡面儲存到Shape Data屬性資料的時候,數值型、字元型的值儲存均要再前後加雙引号。
答案:錯,數值型是不需要加雙引号的。
8)Visio二次開發,可以通過代碼實作形狀資料視窗、模具檔案視窗、掃視和縮放等視窗的可見性進行控制,但不能通過代碼調用Visio控件裡面的界面元件對象(如CommandBar等UI元件對象)。
答案:錯,均可以。
9)Visio除了可以在Winform中通過控件實作對文檔的編輯外,也可以通過安裝Visio Viewer工具,實作Visio文檔基于Web方式的修改編輯。
答案:錯,Web方式隻能檢視,無法實作修改。
10) Visio Drawing Control控件,有一個重要的SRC屬性是用來打開或者關閉目前文檔,如果開始為該屬性指定特定的檔案路徑後,再次設定SRC為空,那麼控件顯示的文檔就會變為空白文檔。
答案:錯,SRC隻是關閉對引用檔案的操作,不會影響文檔的顯示,還是顯示原來的文檔。
11)模具檔案屬性的修改,必須先以讀寫方式打開模具文檔,才能進行相關的操作。
12)Visio文檔通過SRC打開指定檔案後,如果要重新關聯到不同的檔案上去,需要通過Marshal.ReleaseComObject方法來釋放已有的對象,如果是建立一個Visio文檔,則不需要這樣操作。
答案:錯,均需要釋放對象。
13)Visio開發的Winform程式,可以使用兩種方式實作右鍵菜單:一種是通過捕捉Visio控件的MouseUpEvent事件,一種是通過RUNADDONWARGS函數來實作。兩種方式效果一樣,都帶有Visio常用的複制、粘貼、格式、資料等基本的菜單項目。
答案:錯,第一種沒有其他菜單。
14)屬性資料的下拉清單分為:固定清單、可變清單。兩者差別前者不可以通過代碼增加清單項目,後者可以增加;但兩者都可以既從清單中選擇資料,也可以輸入新的内容。
答案:錯誤,他們都可以通過代碼增加清單項目,隻是後者可以選擇已有的,也可以輸入其他内容。
15)Visio文檔提供列印目前頁、目前視圖、分頁列印等操作,同時也支援列印標明區域。
16)如果修改了模具的Master對象的形狀資料定義,如增加一個屬性字段,那麼圖紙對應的Master和Shape也能自動實作更新。
答案:錯,更新模具形狀屬性後,需要手動更新圖紙的資訊。
17)通過代碼操作,除了可以修改Shape對象的值外,還可以實作Shape對象的文本内容、字型大小、線條粗細、顯示顔色等屬性的修改。
對。
18)Visio文檔有且隻有一個模具模闆(Master對象),一個模具對象在文檔中可有多個圖元(Shape對象)。
答案:對。
19)一個形狀檔案包含一系列的模具組合,如開關模具組、跨越模具組。
20)Visio文檔可以儲存為XML格式檔案,通過這個檔案可以看到各種Visio對象之間的組織關系。
二)實戰開發題(每題50分,共1題,總分50分)
例子要求:
1、打開指定的Visio及模具檔案,可以儲存Visio檔案,導出Visio為CAD。
2、選擇打開不同的Visio檔案,實作對象釋放及重新加載。
3、模仿EnventSink.cs代碼實作事件的偵聽及處理操作。
4、為頁面添加一個右鍵菜單【測試】,單擊測試彈出對話框顯示頁面數量、目前頁面名稱、Shape數量。
5、可以打開、隐藏模具檔案視窗。
答案:
打開相關的Visio檔案,并在圖紙上右鍵,顯示右鍵菜單【測試】
響應菜單操作後,界面彈出對話框,提示相關的資訊,如下圖。
例子關鍵的代碼如下所示:
private void btnOpen_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "Visio檔案(*.vsd)|*.vsd|所有檔案(*.*)|*.*";
dlg.FilterIndex = 1;
if (dlg.ShowDialog() == DialogResult.OK)
{
OpenVisio(dlg.FileName);
}
}
private void OpenVisio(string fileName)
VisioUtility.CloseAllStencileDocument(VisApplication);
Marshal.ReleaseComObject(VisApplication);
Marshal.ReleaseComObject(VisDocument.EventList);
Marshal.ReleaseComObject(VisDocument);
Marshal.ReleaseComObject(VisWindow);
GC.Collect();
Thread.Sleep(100);
this.axDrawingControl1.Src = fileName;
this.axDrawingControl1.Src = "";
InitEventSink(VisApplication, VisDocument);
this.axDrawingControl1.Document.Saved = true;
List<string> filePaths = GetFilePaths(gStencileFileBasePath);
foreach (string stencil in filePaths)
VisioUtility.OpenStencilRead(VisApplication.Documents, stencil);
AddContextMenu();
private void AddContextMenu()
Visio.Page page = VisioUtility.GetPage(VisDocument, "饋線圖");
bool isEnable = true;
if (page != null)
//清除所有相關的菜單事件
page.PageSheet.DeleteSection((short)VisSectionIndices.visSectionAction);
//加入新的菜單
VisioUtility.AddRightMouseAction(page.PageSheet,
"\"測試\"",
"RUNADDONWARGS(\"QUEUEMARKEREVENT\", \"/Drawing=測試\")",
isEnable, true, false, false, true, true);
}