Mark Bukovec
Empire Down Developmenthtml
適用於:
Microsoft® Office Visio® 2003算法
**摘要:**學習將 Microsoft® Office Visio® 2003 ActiveX® 控件(即 Visio 繪圖控件)集成到應用程序中。查看最佳做法以及如何以編程方式使用 Visio 繪圖控件。編程
簡介
瞭解 Visio 繪製控件
使用 Visio 繪圖控件的場景
設計最佳做法
開始使用
將控件與主機容器相結合
部署
小結windows
Microsoft® Office Visio® 2003 ActiveX® Control(Visio 繪圖控件)經過豐富的 Visio 對象模型,做爲可嵌入組件來提供 Visio 應用程序的完整功能。您能夠經過宿主應用程序中的事件或代碼,以編程方式驅動 Visio 繪圖控件。此外,Visio 繪圖控件能夠在您本身的應用程序用戶界面 (UI) 的上下文中爲應用程序用戶提供圖表製做環境。設計模式
在本文中,您將學到:瀏覽器
Visio 繪圖控件的功能和示例使用場景。安全
在 Visio 解決方案中使用 Visio 繪圖控件的最佳做法。服務器
如何將 Visio 繪圖控件嵌入到各類宿主應用程序中,包括 Microsoft Windows®窗體、Microsoft Visual Basic®6.0 窗體、Microsoft Office 文檔以及 Microsoft Internet Explorer。數據結構
如何使用 Visio 繪圖控件 API 的屬性。app
如何將 Visio 文檔加載到繪圖控件窗口並保存更改。
如何得到對 Visio Application 對象的引用,以便以編程方式使用 Visio 文檔。
如何管理繪圖畫面的顯示。
如何將控件與宿主應用程序用戶界面相結合。
如何利用應用程序部署 Visio 繪圖控件。
Visio 繪圖控件將在組件中提供 Visio 應用程序對象模型的功能。Visio 繪圖控件能夠嵌入使用 Microsoft Visual Studio®.NET 200三、Microsoft Office XP 和 Microsoft Office 2003 容器(如 Microsoft Office Word 200三、Microsoft Internet Explorer 5.0 以及更高版本和其餘 Microsoft ActiveX® 控件容器)開發的宿主應用程序中。添加 Visio 繪圖控件後,該控件就會爲顯示形狀提供繪圖畫面。
Visio 繪圖控件容許開發人員在另外一個應用程序的上下文內提供 Visio 功能。這種新級別的集成容許開發人員徹底控制與宿主應用程序相結合的 Visio 用戶界面。該新增功能更爲強大,而不只僅是將 Visio 繪圖嵌入到 OLE 容器文檔(如 Word)中。將 Visio 繪圖用做 OLE 對象容許您查看容器應用程序中的關係圖、將 OLE 對象連接到實際 Visio 文檔以反映更改以及經過從容器文檔內激活 Visio 應用程序來編輯 Visio 繪圖。
在就地 OLE 激活的狀況下,您仍然工做於 Visio 用戶界面內。您沒法建立本身的 UI。沒法經過使用包含應用程序的自動功能來以編程方式訪問 Visio 文檔。您還會受限於只能使用實現 OLE 容器的應用程序主機,這樣就不能使用諸如 .NET Windows 窗體之類的技術。
可是,Visio 繪圖控件提供瞭解決這些狀況的新功能,而且容許您開發在之前不可能開發的新 Visio 解決方案,例如本文如下 「使用 Visio 繪圖控件的場景」 部分中介紹的那些解決方案。
Visio 繪圖控件經過 Visio 產品安裝發行。還有一個可用於對 Visio 繪圖控件 API 進行託管代碼訪問的主 interop 程序集。若是要從託管代碼使用該控件,則必須安裝 Visio 主 interop 程序集。請參閱本文的「部署」部分以得到有關安裝 Visio 繪圖控件和 Visio 主 interop 程序集的詳細信息。
要演示 Visio 繪圖控件的實用性,請考慮如下客戶場景。
公司的行政部門爲行政助理提供了一個辦公空間計劃應用程序。Windows 窗體做爲繪圖控件的宿主,顯示錶明辦公室佈局的區域。繪圖控件旁邊是表明辦公室傢俱的按鈕。當行政助理單擊一個按鈕時,就會在繪圖窗體上放置一個形狀,而後他能夠在繪圖控件上從新定位該形狀以查看辦公室中的傢俱佈置外觀。
Windows 窗體包含一個以 Visual Basic .NET 編寫的事件處理程序,它響應添加的新形狀而且跟蹤傢俱選擇以生成採購定單。經過在繪圖控件中刪除形狀,行政助理能夠從新佈置和取消傢俱選擇。由於行政助理是從窗體的 UI 來操縱繪圖畫面的,因此用戶無需熟悉 Visio 應用程序。
一個管理團隊正致力於制訂員工工做流程圖。爲了有助於協做,該團隊使用了 Microsoft Office SharePoint™ Portal Server,它爲團隊文檔和工具提供了一個集中存儲點,以便團隊協做和共享文檔。經理們並不熟悉繪圖工具,而且他們但願在 Microsoft Office Excel 電子表格中輸入工做步驟,而後讓 Visio 從這些數據中生成流程圖繪圖。並且,他們但願在同一瀏覽器頁面上查看全部的數據。
要實現這些要求,應用程序開發人員需修改 SharePoint 站點上的團隊頁面,方法是添加顯示用於定義工做步驟的 Excel 電子表格的數據表 Web 部件。而後,開發人員建立一個宿主繪圖控件的自定義 Web 部件。開發人員將兩個 Web 部件連接在一塊兒,而在繪圖控件內部會自動生成源自 Excel 中的工做步驟信息的流程圖。若是某位經理想要修改該流程圖,她能夠編輯數據表 Web 部件中的行,而後刷新該流程圖形狀以反映所作的更改。該解決方案容許經理們在同一瀏覽器頁面內使用他們最喜愛的工具來完成全部的更新操做。
該控件可讓您使用各類主機容器構建如剛纔介紹的事件驅動應用程序。您能夠將繪圖畫面組件添加到現有的或規劃的應用程序中,而不是構建宿主於 Visio 應用程序用戶界面中的解決方案。對於 Visio 繪圖控件,應用程序一般會反映如圖 1 所示的體系結構。
圖 1. 宿主 Visio 繪圖控件的應用程序
在應用程序中使用 Visio 繪圖控件提供如下優勢:
Visio 繪圖控件運行在應用程序的進程內,而且不要求運行 Visio 應用程序的單獨實例。
該控件針對每一個實例顯示單個 Visio 文檔和單個窗口。能夠經過將多個控件實例嵌入到宿主應用程序中來顯示多個文檔。Visio 繪圖控件還公開了一個用於加載現有 Visio 文件的方法。
該控件容許用戶界面與宿主應用程序相結合。開發人員能夠爲不熟悉 Visio 的用戶提供簡化的用戶界面。
宿主應用程序能夠經過嵌入控件實例來訪問 Visio Automation 屬性和方法。這容許宿主應用程序以編程方式修改包含的 Visio 文檔。
該控件直接公開 Visio Window 和 Document 事件。
您還可使用託管代碼來開發 Visio 繪圖控件解決方案。託管代碼互操做性經過 Visio 主 interop 程序集提供,這些程序集提供對 Visio 繪圖控件 API 和 Visio Automation 庫的託管代碼訪問。在出現該繪圖控件以前,對於託管代碼,只能使用託管語言編寫 COM 加載項或可執行文件。使用該控件,您能夠直接從應用程序執行 Visio Automation 代碼。這種集成容許您將 Windows 窗體用做應用程序容器而且以託管語言(例如 Visual Studio C++、Visual.NET C# 或 Visual Basic .NET)編寫代碼。
由於 Visio 繪圖控件是可編程組件,您能夠直接將 Visio 解決方案代碼集成到主機容器應用程序中。在之前的 Visio 版本中,開發人員爲 Visio 客戶端應用程序編寫解決方案時,須要在 COM 加載項、Visio 解決方案庫 (VSL)、進程外可執行文件或在文檔中的 Visual Basic for Applications (VBA) 項目中打包解決方案代碼。
經過容許從宿主應用程序對 Visio Application 對象進行編程,Visio 控件簡化了解決方案體系結構和開發過程。在自定義應用程序(例如 C# 應用程序)或 Internet Explorer 中使用控件的開發人員應該直接針對宿主應用程序中的 Visio 對象模型進行編程,而沒必要將 Visio 邏輯分隔到 COM 加載項、VSL 或可執行文件中。從宿主應用程序中調用 Visio COM 加載項、VSL 或可執行文件,使得 Visio 集成的調試複雜化了,這毫無必要。
可是,若是但願在 Microsoft Office System 應用程序而不是在 Visio 中宿主 Visio 控件,則必須使用 COM 加載項。在這種狀況下,爲宿主應用程序(而不是 Visio)建立一個 COM 加載項。例如,若是您計劃將 Visio 控件宿主於 Microsoft Office Word 2003 文檔中,則建立一個 Word COM 加載項,而後經過該 Word 加載項訪問 Visio 控件。確保該主機的目標是 COM 加載項,由於 Office 宿主應用程序將不會加載繪圖控件的 Visio COM 加載項。
Visio 繪圖控件支持不少容器,其中包括構建在 Visual Studio.NET 200三、Visual Studio 6.0、Internet Explorer 5.0 或更高版本、ASP.NET 以及其餘 ActiveX 控件容器中的宿主應用程序。可是,Visio 控件沒法直接嵌入到:
另外一個 ActiveX 控件中,如 Internet Explorer 瀏覽器控件。
Visio 文檔。
Microsoft Office InfoPath™ 2003 表單。
注 能夠將 ActiveX 控件嵌入到 Visio 繪圖控件中(而不是將 Visio 繪圖控件嵌入另外一個 ActiveX 控件中)。可是,由於 Visio 繪圖控件沒法在 Visio 文檔中執行 VBA 代碼,因此最好將其餘 ActiveX 控件集成到宿主應用程序項目中,而不是集成到 Visio 文檔中。
即便沒法直接將 Visio 繪圖控件嵌入到另外一個 ActiveX 控件中,您仍然能夠利用依賴於 Internet Explorer 瀏覽器控件的應用程序來使用 Visio 繪圖控件。
Internet Explorer 5.0 或更高版本爲 Visio 繪圖控件提供了很是優秀的主機容器,容許開發人員根據 Microsoft Visual Basic Scripting Edition (VBScript) 中的 Visio 對象模型或者根據由 European Computer Manufacturers Association 規範定義的 ECMAScript 來編寫腳本,例如 JScript 或 JavaScript。
要將 Visio 繪圖控件與基於 Internet Explorer 瀏覽器控件的應用程序相結合,例如 Microsoft Office Project Web Access 客戶端,請執行如下操做:
在 Internet Explorer 瀏覽器控件中添加一個連接,該連接利用其本身的窗口啓動新的 Internet Explorer 進程。
將 Visio 繪圖控件嵌入到新的 Internet Explorer 窗口中以用於新的 Internet Explorer 進程。
使用您喜歡的腳本語言根據 Visio 繪圖控件進行編程。
儘管沒法將 Visio 繪圖控件直接嵌入到 InfoPath 2003 表單,InfoPath 仍是提供了包含 Internet Explorer 窗口的解決方案任務窗格。您能夠將 Visio 繪圖控件直接嵌入到該 InfoPath 解決方案任務窗格窗口中,而後使用文檔對象模型 (DOM) 以在 Visio 繪圖和 InfoPath 表單之間共享數據。
當設計使用 Visio 繪圖控件的應用程序時,瞭解 Visio 控件在單個窗口中支持單個文件很是重要。因爲該控件的單文檔界面 (SDI) 體系結構,因此在設計集成 Visio 繪圖控件與應用程序時要考慮如下事項:
**使用 Visio 繪圖控件的多個實例以在應用程序中顯示多個 Visio 文檔。**Visio 客戶端應用程序能夠同時顯示多個文檔和窗口,Visio 繪圖控件與其不一樣,它只能針對每一個控件的實例顯示一個單一文檔。若是開發人員要顯示多個 Visio 文檔,開發人員可將該控件的多個實例嵌入應用程序,每一個實例加載一個單獨的 Visio 文檔。
**不依賴於 VBA 對邏輯進行編程。**VBA 沒有包括在 Visio 繪圖控件中。所以,在 Visio 繪圖控件中加載的文檔不會執行任何與該文檔相關聯的 VBA 代碼。控件缺乏 VBA 運行時環境會阻止經過由 Visio 控件加載的文檔分發合法代碼或惡意宏。它還意味着做爲控件宿主的應用程序用戶將永遠不會看到 Visio 應用程序的警告有關文檔中的宏的安全對話框。
以編程方式使用 Visio ShapeSheet®**。**該控件不提供到 Visio ShapeSheet 用戶界面的訪問,該界面是 Visio 應用程序中的獨立窗口。可是,ShapeSheet 自己仍然由於 Visio 繪圖控件中加載文檔中的 Visio 形狀和頁面而存在。您仍然可使用Visio Automation 來編輯控件中 Visio 文檔的 ShapeSheet 單元格。例如,您可使用 Cell 對象的 Src 屬性爲 Visio 形狀添加雙擊操做。
注 對在控件中加載的文檔的 ShapeSheet 進行編程時,您將沒法使用 CALLTHIS 函數,該函數會調用文檔中的 VBA 宏。Visio 繪圖控件不執行 VBA 代碼,所以全部對 CALLTHIS 函數的使用都會失敗,同時不會出現任何提示。可是,您可使用 Visio Page 和 Document 對象的鼠標事件,並在自定義容器應用程序邏輯中處理事件響應。(有關鼠標事件的詳細信息,請參閱「處理事件」。)若是您使用的是 COM 加載項,則還可使用 QUEUEMARKER 函數根據 ShapeSheet 中的雙擊事件隊列 marker 事件。
在將代碼從現有的 Visio 客戶端應用程序解決方案遷移到 Visio 控件時,請將這些設計注意事項包括在您的計劃中。
**遷移 VBA 代碼。**您必須將全部現有的 VBA 代碼遷移到 COM 加載項中,或者最好是遷移到宿主應用程序中。您能夠保留大多數的相同算法和邏輯,只要它能夠工做在控件的 SDI 體系結構中。
**將現有的 Visio 解決方案 COM 加載項、可執行文件或 VSL 遷移到容器應用程序。**儘管利用宿主應用程序使用現有 COM 加載項、可執行文件或 VSL 最初可能會比較簡單,但仍是建議您直接將 Visio 繪圖控件編程直接與宿主應用程序結合使用。在花時間將代碼從現有解決方案遷移到宿主應用程序後,您將簡化解決方案的部署,以後隨着時間推移會簡化開發、調試和維護過程。無需使用 COM 加載項,除非您要使用另外一個 Office 容器中的控件。
**從新評估形狀中的數據存儲。**若是當前的 Visio 解決方案在形狀中存儲了大量的數據,請考慮將數據存儲從 Visio 形狀中提出並從新設計爲由宿主應用程序維護或訪問的數據結構。Visio 能夠根據須要存儲任意多的數據,但若是將 Visio 做爲表示層組件並將宿主應用程序用做數據存儲或經過它來訪問數據源,則會更有意義。若是數據是相對靜態、但頻繁地用其來修改形狀的外觀和佈局,那麼將信息存儲在形狀自定義屬性中會更有意義。
**考慮將事件與宿主應用程序結合。**與 Visio 客戶端應用程序解決方案不一樣,Visio 繪圖界面能夠響應用戶事件和宿主應用程序事件。請考慮您但願繪圖畫面如何響應由宿主應用程序激發的事件,以及您的宿主應用程序須要如何響應 Visio 繪圖畫面中的事件。
**使用 COM 加載項的 marker 事件。**若是必須使用 COM 加載項,則須要一種通知 COM 加載項響應文檔中用戶操做的方法。使用 ShapeSheet 中 的 QUEUEMARKER 函數或文檔中持久性事件來排隊 COM 加載項要響應的 marker 事件。
若是您只啓動集成應用程序的 Visio,則最好直接根據宿主應用程序代碼中的 Visio 對象模型進行編程。除了本文檔中的設計建議和實現指導外,還需參考如下資源以得到有關使用 Visio 對象模型的信息:
Microsoft Office Visio Automation Reference 提供有關 Visio 對象模型的技術文檔。
Microsoft Office Visio ShapeSheet Reference 提供有關能夠經過 Visio 對象模型進行編程的 ShapeSheet 單元格和函數的技術文檔。
MSDN 上的 Visio 開發人員中心 爲全部級別的 Visio 開發人員提供文章、教程和軟件開發工具包 (SDK)。
本部分包含在應用程序中使用 Visio 繪圖控件的基本步驟。它將說明如何將控件嵌入到主機容器中、如何將 Visio 文檔加載到控件窗口並保存更改以及如何得到對 Visio Application 對象的引用,以便您能夠藉助編程方式使用 Visio 文檔。
本部分將詳細說明建立 Visio 繪圖控件實例和設置下列容器引用的過程:Windows 窗體、基於 Visual Basic 6.0 窗體的應用程序、Office 文檔和 Internet Explorer。
注 開發人員沒法在設計階段激活 Visio 控件中的 Visio 繪圖。控件中的 Visio 繪圖只能在運行時激活。
您能夠輕鬆地以託管代碼方式建立 Visio 繪圖控件實例。
完成這個過程以將下列程序集引用添加到項目中:
VisioOcx Visio 繪圖控件主 interop 程序集。
Visio Visio 類型庫主 interop 程序集。
AxVisOcx 容許控件嵌入到 Windows 窗體中的 ActiveX 控件包裝程序集。Windows 窗體 ActiveX 控件導入程序 (Aximp.exe) 會自動生成這個程序集並將其添加到項目中。這個包裝程序集必須與應用程序一塊兒從新發布。窗體上的多個 Visio 繪圖控件實例共享派生自 AxHost 類的相同包裝類。
在 Visual Studio .NET 中,在設計模式中顯示 Windows 窗體。單擊工具箱。
在工具箱內右鍵單擊,而後選擇 Add/Remove Items 打開 Customize Toolbox 對話框。
單擊 Customize Toolbox 對話框中的 COM Components 選項卡。爲類型庫選中 Microsoft Visio Drawing Control,如圖 2 所示。
圖 2. 將 Visio 繪圖控件添加到 Visual Studio .NET 工具箱中
單擊 OK。Visio 繪圖控件如今出如今工具箱中,如圖 3 所示。
圖 3. Visual Studio .NET 工具箱中的 Visio 繪圖控件
經過在工具箱中雙擊 Visio 繪圖控件,或者單擊 Visio 繪圖控件而後將其拖動到窗體,能夠將該控件添加到窗體。
您能夠簡單地使用 Visual Basic 6.0 來建立 Visio 繪圖控件實例。完成這個過程以將引用添加到 Visio 繪圖控件類型庫。若是要以編程方式更改包含在繪圖控件實例中的 Visio 文檔,則須要添加一個對 Microsoft Visio 11.0 類型庫的引用。
在 Visual Basic 6.0 中,在設計模式中顯示窗體,右鍵單擊工具箱,而後選擇 Components。
在 Components 對話框中的 Controls 選項卡上,選中 Microsoft Visio Drawing Control 11.0,如圖 4 所示。
圖 4. 將 Visio 繪圖控件添加到 Visual Basic 6.0 工具箱中
單擊 OK。Visio 繪圖控件如今出如今工具箱中。
圖 5. Visual Basic 6.0 工具箱中的 Visio 繪圖控件
經過在工具箱中雙擊 Visio 繪圖控件,或者單擊 Visio 繪圖控件而後將其拖動到窗體,能夠將該控件添加到窗體。
完成這個過程以將引用添加到 Visio 繪圖控件類型庫。若是要以編程方式更改包含在繪圖控件實例中的 Visio 文檔,則須要添加一個對 Microsoft Visio 11.0 類型庫的引用。
右鍵單擊 Office 應用程序的工具欄,而後選擇 Control Toolbox。
在 Control Toolbox 工具欄上,單擊 More Controls 按鈕,而後選中 Microsoft Visio Drawing Control,如圖 6 所示:
圖 6. 將 Visio 繪圖控件添加到 Microsoft Office Word 工具箱中
在將 Visio 繪圖控件插入到 Office 應用程序文檔後,能夠經過右鍵單擊它,而後選擇 Properties 來查看其屬性。若是要從文檔的 Visual Basic 項目中以編程方式訪問 Visio 繪圖控件,那麼右鍵單擊該控件,而後選擇 View Code。
要將 Visio 繪圖控件添加到 Web 窗體或 HTML 頁,您要遵循「以託管代碼方式建立 Visio 繪圖控件實例」中的步驟,不一樣之處在於您要將 Visio 繪圖控件拖動到 Web 頁上,而不是 Windows 窗體上。Visual Studio .NET 將下面的 HTML 添加到 Web 頁:
修改 Properties 窗口中的值以更新 Visio 繪圖控件實例中的屬性標記。例如,若是修改 Src 屬性,Visual Studio .NET 會生成相似於下面的標記:
將 Visio 繪圖控件宿主爲客戶端對象,併爲腳本語言(例如,VBScript)支持限量屬性。您能夠編寫腳本對 Visio 繪圖控件所公開的屬性進行更改。可是,您沒法使用腳本語言訪問 Visio 對象模型,這意味着您沒法以編程方式更改由控件顯示的 Visio 文檔。用戶能夠經過單擊繪圖畫面對 Visio 文檔進行更改。
注 該控件將只初始化任意給定的 Internet Explorer 進程中的第一個線程。若是您但願在基於 Internet Explorer 的應用程序中使用該控件的多個實例,請爲該控件的每一個額外的實例建立一個新的 Internet Explorer 進程,而後在新的 Internet Explorer 進程中加載包含該控件的 HTML 頁。
您能夠經過 Visio 繪圖控件的 API 來訪問 Visio 對象模型。要得到對 Visio Application 對象的引用,請使用繪圖控件的 Document 或 Window 屬性。
例如,下面的 C# 代碼說明如何使用該繪圖控件的 Window 屬性以得到對 Visio Application 對象的引用。
using Microsoft.Office.Interop.Visio; private Microsoft.Office.Interop.Visio.Application application = null; application = (Microsoft.Office.Interop.Visio.Application) drawingControl.Window.Application;
可使用下面的 Visual Basic 6.0 代碼來完成相同的任務:
Dim vsoApplication As Visio.Application Set vsoApplication = DrawingControl.Window.Application
當加載 Visio 繪圖控件時,將會顯示一個空白 Visio 繪圖。若是但願顯示現有的 Visio 文檔,則繪圖控件會公開一個 Src 屬性以便將文檔加載到控件中。而後,您可使用文檔的 SaveAs 方法保存全部更改。
使用 Visio 繪圖控件的 Src 屬性來將文檔加載到該控件。例如,下面的 C# 示例將顯示如何加載 Visio 繪圖:
drawingControl.Src = "C:\\Drawing.vsd";
可使用 Src 屬性加載任意 Visio 文件類型(例如,.vsd、.vdx、.vst 或 .svg)。能夠本地存儲該文件或將其存儲在遠程文件服務器上。
Visio 控件的 Src 屬性會加載在 Src 值中指定的文件副本。要將更改保存在控件的文檔中,必須使用 SaveAs 方法來保存 Visio 文檔。或者,還能夠保存流中的更改。可是,在這兩種狀況下,都不能修改由 Src 屬性加載的原始文檔。
該控件加載由 Src 屬性指定的文件副本。經過 SRC 加載的文件不能用於讀取/寫入操做,所以沒法使用 Save 方法保存。要將更改保存到 Visio 繪圖控件中加載的文檔,請調用文檔的 SaveAs 方法。下面的 C# 示例將說明如何使用繪圖控件的 Document 屬性來調用 SaveAs 方法:
Visio.Document document = drawingControl.Document; document.SaveAs("C:\\Drawing.vsd");
您沒法使用 SaveAsEx 方法將 Visio 2003 文檔保存到 Visio ActiveX 控件中的 Visio 2002 格式。要將 Visio 繪圖控件中加載的繪圖保存到 Visio 2002 格式,請啓動一個 Visio 的不可見實例,並在 Visio 應用程序實例中調用 SaveAsEx 方法,如同 Visual Basic 6.0 代碼中的演示,該代碼將 Visio 2003 繪圖保存到 Visio 2003 文件格式中:
Application.Documents(1).SaveAsEx("C:\Documents and Settings" & _ "\myusername\My Documents\Visio2002 file.vsd", visSaveAsWS + _ visSaveAsListInMRU)
開發人員可能要將更改保存到 Visio 繪圖控件的繪圖中,而無需將繪圖保存到磁盤中。例如,若是用戶修改 Word 文檔中嵌入控件中的 Visio 文檔,那麼當用戶將該 Word 文檔以電子郵件消息形式轉發時,所作的更改會丟失。當另外一個用戶打開該文檔時,該控件會加載由 Src 屬性指定的文件,覆蓋全部修改。
使用 Visio 控件的 Src 屬性加載原始文檔。
在加載該文檔後,將 Src 屬性設置爲空字符串。
當控件在第一次初始化後在其容器文檔中激活時,該控件會顯示最後一個流中的圖像,而不顯示由 Src 屬性指定的原始文檔。
要在第一次初始化該控件時將空白繪圖加載到其中,請將 Src 屬性設置爲空字符串。可是,若是但願在加載現有繪圖文檔後在控件中模擬建立新的空白繪圖,則有三種選擇:
全選並刪除繪圖中全部形狀。該方法容許開發人員將全部現有樣式保留在當前加載的文檔中。
使用 Src 屬性加載新的空白文檔。
動態破壞並從新初始化文檔中的 Visio 繪圖控件。
您能夠修改應用程序中的 Visio 繪圖控件的外觀。默認狀況下,關閉全部 Visio 工具欄,而且不顯示模具窗格。您能夠選擇經過顯示滾動條、標尺或者更改窗口背景顏色來選擇繪圖控件畫面出現的方式。
繪圖控件公開一個 PageSizingBehavior 屬性,該屬性肯定頁面在繪圖控件窗口內顯示的方式。您能夠選擇調整與繪圖控件大小相關的頁面,或者提供相似於 Visio 的視圖,以顯示部分繪圖頁面。
由於該控件只支持單個窗口,因此沒法訪問 ShapeSheet 或諸如圖標編輯器以及主控和分組編輯之類的窗口。默認狀況下,啓用頁面和形狀的右鍵單擊菜單。控制形狀行爲的有限 Visio UI 會反映要與容器應用程序緊密結合的控件的意圖。容許用戶修改文檔上形狀的最佳方法就是使用自定義的 UI。可是,若是您但願使用 Visio 菜單和工具欄,則繪圖控件確實支持與宿主應用程序結合的菜單和工具欄。
最具可能的是,Visio 繪圖控件應用程序會由事件驅動,而且響應包含在應用程序中的用戶單擊按鈕或菜單項。該繪圖控件還公開 Visio 事件,以便您能夠在控件自己內響應用戶單擊。
您能夠經過控件的 Window 屬性修改 Visio 繪圖控件表面的外觀。例如,下面的 C# 代碼將隱藏繪圖控件的滾動條:
drawingControl.Window.ShowScrollBars = (short)_ Visio.VisScrollbarStates.visScrollBarNeither;
這個示例同時隱藏水平和垂直滾動條。VisScrollbarStates 枚舉的其餘可能值包括 visScrollBarBoth(同時顯示兩個滾動條)、visScrollBarHoriz(顯示水平滾動條)和 visScrollBarVert(顯示垂直滾動條)。
經過移除部分 Visio UI,您可使得繪圖控件看起來與應用程序結合的更緊密。下面的 C# 代碼將隱藏標尺:
drawingControl.Window.ShowRulers = 0;
還能夠更改窗口的背景顏色以適合應用程序的配色方案。例如,下面的 C# 代碼會將窗口的背景顏色設置爲純紅色:
drawingControl.Window.BackgroundColor = (uint) ColorTranslator.ToOle(Color.Red); drawingControl.Window.BackgroundColorGradient = (uint) ColorTranslator.ToOle(Color.Red);
在此示例中,ColorTranslator 類用於將 .NET 顏色類型轉換成 OLE_COLOR 類型,這就是 Visio Automation 指定顏色的方式。
Visio 繪圖控件將相同的基本 Application 對象共享爲 Visio 客戶端應用程序。所以,若是用戶更改 Visio 客戶端應用程序的應用程序設置(例如將頁面背景更改成藍色),那麼在宿主應用程序中運行時,相同的設置將會應用到 Visio 控件。Visio 控件的 HostID 屬性容許您在註冊表中存儲該控件的不一樣用戶設置。要設置 HostID 屬性,請使用字符串來指示將要在 [HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\VisioHosts] 項中建立的子項的名稱。儘管能夠爲控件的子項的名稱使用任意字符串,但最好使用 GUID 來確保惟一性。
HostID 屬性能夠在設計階段在控件的 Properties 窗口中進行設置,也能夠藉助編程方式在宿主應用程序代碼中進行設置。
使用 Visio 繪圖控件的 PageSizingBehavior 屬性根據控件窗口調整頁面的大小。該屬性 (visNeverResizePages) 的默認設置提供的視圖相似於 Visio 的視圖,可在該窗口內查看視圖中頁面的一部分。下面的 C# 代碼示例調整頁面大小以適配該控件:
drawingControl.PageSizingBehavior = Visio.VisPageSizingBehaviors.visResizePages;
當 PageSizingBehavior 設置爲 visResizePages 時,該頁面的形狀將不會根據該頁面進行調整。形狀會保留在 Visio 頁面座標系統的相對位置,其原點位於頁面的左下角。在控件內調整頁面的大小進行適配會隱藏頁邊界,在控件調整到繪圖畫面的最大區域時,這一點會很是有用。
要在繪圖控件窗口中從新調整整個頁面(包括其形狀),請經過控件的 Window 屬性設置 Zoom 屬性,以下面的 C# 示例所示:
drawingControl.Window.Zoom = 2.0;
該代碼將窗口的內容放大到 200%。要使其生效,必須在使用 Src 屬性加載文檔後對縮放設置進行設置。
要防止用戶更改縮放設置,請設置 ZoomLock 屬性,以下面 C# 示例所示:
drawingControl.Window.ZoomLock = true;
經過 VisZoomBehavior 屬性能夠設置 Visio 所控制的縮放的最大範圍,該屬性能夠經過繪圖控件的 Window 或 Document 屬性進行訪問。默認狀況下,該控件使用文檔的當前縮放設置。若是但願可以將縮放設置到任意級別,不要只設置爲不連續設置(例如,50% 或 100%),在不對外觀進行任何調整的狀況下,可將 VisZoomBehavior 屬性設置爲 VisZoomVisioExact 值,以下面的 C# 示例所示:
drawingControl.Window.ZoomBehavior = Visio.VisZoomBehavior.visZoomVisioExact;
注 沒法在 Word 文檔中調整 Visio 繪圖控件大小。若是要調整繪圖控件大小並保存更改,則在下一次打開該 Word 文檔時該控件將重置爲其默認大小。
您可使用 Visio ItemFromID 屬性「關閉」文檔的模具窗格中的 Visio 形狀搜索窗口。要使形狀搜索窗口在模具窗格中不可見,請將該屬性的 Visible 屬性設置爲 false,例如:
Windows(1).ItemFromID(Visio.visWinIDShapeSearch).Visible = False
要在模具窗格中顯示形狀搜索窗口,請將相同的值設置爲 True。
注 您只能管理基於每一個窗口的形狀搜索窗口的可見性。
在使用 Visio 繪圖控件構建應用程序時的最佳做法就是實現一個自定義 UI。若是您但願在容器應用程序中顯示 Visio 菜單和工具欄,請設置繪圖控件的 NegotatiateToolbars 和 NegotiateMenus 屬性。下面的 C# 代碼同時啓用菜單和工具欄合併:
drawingControl.NegotiateMenus = True; drawingControl.NegotiateToolbars = True;
最佳做法是將這兩個參數設置爲相同的值。該控件將不支持工具欄和菜單的獨立協商。
容器應用程序必須支持 OLE 菜單合併以便顯示 Visio 菜單或工具欄。例如,您能夠在 Word 文檔中啓用工具欄合併。在 Word 文檔的 Visual Basic 項目中,您能夠藉助編程方式顯示 Visio 工具欄。下面的示例將顯示 Layout & Routing 工具欄。
vsoApplication.CommandBars("Layout & Routing").Visible = True重要說明 請勿嘗試將菜單和工具欄與 ActiveX 控件的多個活動實例合併。該控件的多個實例共享單個基本 Visio Application 對象。在嘗試將菜單與單個 Application 對象和該控件的多個活動實例合併在一塊兒時,可能會獲得意外結果。
要要說明 請勿將菜單和工具欄與 Internet Explorer 用戶界面合併。在 Internet Explorer 中合併菜單存在着已知的問題(請參閱 Microsoft 知識庫文章 193098 PRB:Unexpected Menu Merging Behavior in Internet Explorer)。
若是您的容器不支持 OLE 菜單合併(例如,Windows 窗體),您可使用 IOleCommandTarget 接口運行 Visio 命令。您能夠實現本身的菜單項和工具欄按鈕,以下面的 C# 示例所示:
using System.Runtime.InteropServices; using System; namespace OleCommandTarget { [StructLayout(LayoutKind.Sequential)] public struct OLECMDTEXT { public UInt32 cmdtextf; public UInt32 cwActual; public UInt32 cwBuf; public char rgwz; } [StructLayout(LayoutKind.Sequential)] public struct OLECMD { public UInt32 cmdID; public UInt64 cmdf; } [ComImport(), Guid("B722BCCB-4E68-101B-A2BC-00AA00404770"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IOleCommandTarget { [PreserveSig()] int QueryStatus( [In, MarshalAs(UnmanagedType.Struct)] ref Guid pguidCmdGroup, [MarshalAs(UnmanagedType.U4)] int cCmds, [In, Out] IntPtr prgCmds, [In, Out] IntPtr pCmdText); [PreserveSig()] int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdExecOpt, object[] pvaIn, [In, Out, MarshalAs(UnmanagedType.LPArray)] object[] pvaOut); } }
在建立菜單項後,請使用 IOleCommandTarget 接口將適當的 Visio 用戶界面命令用於該目標。下面的示例在單擊菜單項時會啓用 Connector 工具:
using OleCommandTarget; private void menuItem_Click(object sender, System.EventArgs eventData) { SendCommand(); } private void SendCommand() { const UInt32 VISCMD_DRCONNECTORTOOL = (UInt32)Visio.VisUICmds.visCmdDRConnectorTool; IOleCommandTarget commandTarget = (IOleCommandTarget)axDrawingControl1.GetOcx(); try { Guid CLSID_Application = new Guid("{0x00021A20, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}"); commandTarget.Exec(ref CLSID_Application, VISCMD_DRCONNECTORTOOL, 0, null, null); } catch(System.Runtime.InteropServices.COMException ex) { MessageBox.Show(ex.ToString()); } }
爲了 Visio 事件的使用更爲簡便,Visio 繪圖控件對象將公開全部 Visio Window 和 Document 事件。這容許開發人員能夠直接從該控件訪問這些事件,而無需經過 Visio Document 對象。
鼠標和鍵盤事件一般用於 Visio 控件編程中。您能夠在 Visio 繪圖控件上使用鼠標事件來顯示自定義的 Windows 窗體以及更新宿主應用程序中的數據。
若是但願「鎖定」Visio 控件的繪圖畫面,並防止最終用戶直接修改繪圖中的任何內容,您能夠偵聽全部鍵盤和鼠標事件並「丟棄這些事件」。若是宿主應用程序「抑制」了鼠標和鍵盤事件,則 Visio 繪圖畫面將不會響應用戶的鍵入和鼠標單擊操做。
由 Visio AddAdvise 方法建立的事件對象提供了最佳的性能。您能夠像使用任何其餘 Visio 事件同樣,將 Visio 鼠標和鍵盤事件與 AddAdvise 一塊兒使用。
下面的代碼示例將演示如何使用 Visual Basic 6.0 中的事件接收器來捕獲鼠標事件:
Implements Visio.IVisEventProc Private Function IVisEventProc_VisEventProc( _ ByVal nEventCode As Integer, _ ByVal pSourceObj As Object, _ ByVal nEventID As Long, _ ByVal nEventSeqNum As Long, _ ByVal pSubjectObj As Object, _ ByVal vMoreInfo As Variant) As Variant Dim strMessage As String ' Determine if mouse up event fired. If nEventCode = visEvtCodeMouseUp Then MsgBox ("MouseUp coordinates (" & pSubjectObj.X & ", " _ & pSubjectObj.Y & ")") End If End Function
下面的代碼示例說明如何使用 AddAdvise 方法來建立鼠標對象的事件對象。
Private mEventSink As clsEventSink Dim vsoMouseUpEvent As Visio.Event Dim vsoWindowEvents As Visio.EventList Set mEventSink = New clsEventSink Set vsoWindowEvents = DrawingControl1.Window.EventList Set vsoMouseUpEvent = vsoWindowEvents.AddAdvise( _ visEvtCodeMouseUp, mEventSink, "", "Mouse up...")
儘管使用 AddAdvise 建立的事件對象提供了最佳性能,您還能夠在 Windows 窗體中定義 C# 委託來處理繪圖控件窗口內的鼠標單擊事件,以下所示:
this.drawingControl.MouseUpEvent += new AxMicrosoft.Office.Interop.VisOcx.EVisOcx_MouseUpEventHandler( this.drawingControl_MouseUpEvent);
而後事件處理程序將會具備如下簽名:
private void drawingControl_MouseUpEvent( object sender, AxVisOcx.EVisOcx_MouseUpEvent eventData)
Visio 鼠標事件在 Page 和 Window 對象上公開。要定位用戶單擊的頁面或窗口中的特定形狀,開發人員必須使用 Visio SpatialSearch 方法。下面的 C# 代碼傳入窗口上單擊事件的 x- 和 y- 座標、設置指示出如何創建選擇對象的 Visio 常量,而後定義一個在 x- 和 y- 座標周圍進行搜索的較小容錯範圍。
MySelection = Window.SpatialSearch(x, y, visSpatialContainedIn, 0.001, visSpatialFrontToBack)
若是將該容錯設置爲相對於形狀大小而言很是小的單位,則 SpatialSearch 方法返回的選擇對象將只包含一個形狀,即最終用戶在該窗口內單擊的形狀。
Visio 繪圖控件是經過 Visio 產品安裝過程進行發行的。這樣,就不會有關於控件自己的附加許可問題了。宿主繪圖控件的應用程序只有在 Visio 安裝到計算機上以後才能工做。
Visio 繪圖控件是做爲 Minimal Install 選項的組成部分進行安裝的。若是您的應用程序是以託管代碼編寫的,而且要利用 Visio 主 interop 程序集,則必須選擇 Typical Install 選項才能安裝 Visio 主 interop 程序集。
首先,確保該計算機已經安裝了 .NET Framework 1.1;不然 Visio 主 interop 程序集將沒法安裝。.NET Framework 1.1 是隨 Visual Studio .NET 2003 安裝的版本。對於運行應用程序的客戶端來講,還能夠安裝做爲應用程序的安裝程序組成部分的免費 .NET Framework 1.1 Redistributable。
此處有兩個選項可用於經過 Visio 產品安裝程序自動部署 Visio 繪圖控件:
編寫 Windows Installer 安裝程序,併爲公司部署使用「無提示安裝」。
直接調用 Visio 產品 Windows Installer 軟件包(Visio .msi 文件)。
下面的示例說明如何使用 Windows 腳本主機來利用 Typical Install 選項以無提示方式安裝 Visio:
Dim WshShell Set WshShell = CreateObject("WScript.Shell") WshShell.Exec("setup.exe /qn PIDKEY= INSTALLLEVEL=20") To call the Visio product MSI directly, use the following code: Dim WshShell Set WshShell = CreateObject("WScript.Shell") WshShell.Exec("msiexec.exe /qn /i " & _ "PIDKEY= INSTALLLEVEL=20")
Visio 繪圖控件容許開發人員以豐富的 Visio 繪圖功能來擴展自定義應用程序和解決方案。經過提供對控件的編程功能以及對完整 Visio 對象模型的訪問,Visio 組件能夠由用戶繪圖操做或宿主應用程序中的事件和數據來驅動。使用 Visio 繪圖控件的解決方案的優勢在於:
自定義應用程序的用戶無需具有 Visio 用戶界面的知識就能夠建立繪圖。應用程序 UI 能夠驅動繪圖建立,並能夠對用戶的 Visio 特定任務進行概要。
對於應用程序宿主和開發工具的選擇,Visio 解決方案開發人員的選擇範圍更爲寬廣。Visio 繪圖控件能夠宿主於任意 ActiveX 容器中。經過使用 Visio 主 interop 程序集,還可使用託管代碼中的 Visio 繪圖控件來開發解決方案。
與涉及 COM 加載項或 VSL 的解決方案相比,提供對 Visio 編程模型的直接訪問使得使用 Visio 繪圖控件的解決方案更易於開發和調試。
關於做者
Mark Bukovec 是一位自由開發人員和技術做家。以前,Mark 曾在 Microsoft 工做過五年,最近是爲 COM+ 組工做的程序經理。您能夠經過 *empiredown@hotmail.com* 聯繫 Mark。