以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件
以編程方式使用 Microsoft Office Visio 2003 ActiveX 控件
Mark Bukovec
Empire Down Development
適用于:
Microsoft? Office Visio? 2003
**摘要:**學(xué)習(xí)將 Microsoft? Office Visio? 2003 ActiveX? 控件(即 Visio 繪圖控件)集成到應(yīng)用程序中。查看最佳作法以及如何以編程方式使用 Visio 繪圖控件。
本頁(yè)內(nèi)容
?簡(jiǎn)介
?了解 Visio 繪制控件
?使用 Visio 繪圖控件的場(chǎng)景
?設(shè)計(jì)最佳作法
?開(kāi)始使用
?將控件與主機(jī)容器相結(jié)合
?部署
?小結(jié)
簡(jiǎn)介
Microsoft? Office Visio? 2003 ActiveX? Control(Visio 繪圖控件)通過(guò)豐富的 Visio 對(duì)象模型,作為可嵌入組件來(lái)提供 Visio 應(yīng)用程序的完整功能。您可以通過(guò)宿主應(yīng)用程序中的事件或代碼,以編程方式驅(qū)動(dòng) Visio 繪圖控件。此外,Visio 繪圖控件可以在您自己的應(yīng)用程序用戶界面 (UI) 的上下文中為應(yīng)用程序用戶提供圖表制作環(huán)境。
在本文中,您將學(xué)到:
-
Visio 繪圖控件的功能和示例使用場(chǎng)景。
-
在 Visio 解決方案中使用 Visio 繪圖控件的最佳作法。
-
如何將 Visio 繪圖控件嵌入到各種宿主應(yīng)用程序中,包括 Microsoft Windows?窗體、Microsoft Visual Basic?6.0 窗體、Microsoft Office 文檔以及 Microsoft Internet Explorer。
-
如何使用 Visio 繪圖控件 API 的屬性。
-
如何將 Visio 文檔加載到繪圖控件窗口并保存更改。
-
如何獲得對(duì) Visio?Application?對(duì)象的引用,以便以編程方式使用 Visio 文檔。
-
如何管理繪圖畫面的顯示。
-
如何將控件與宿主應(yīng)用程序用戶界面相結(jié)合。
-
如何利用應(yīng)用程序部署 Visio 繪圖控件。
了解 Visio 繪制控件
Visio 繪圖控件將在組件中提供 Visio 應(yīng)用程序?qū)ο竽P偷墓δ堋isio 繪圖控件可以嵌入使用 Microsoft Visual Studio?.NET 2003、Microsoft Office XP 和 Microsoft Office 2003 容器(如 Microsoft Office Word 2003、Microsoft Internet Explorer 5.0 以及更高版本和其他 Microsoft ActiveX? 控件容器)開(kāi)發(fā)的宿主應(yīng)用程序中。添加 Visio 繪圖控件后,該控件就會(huì)為顯示形狀提供繪圖畫面。
Visio 繪圖控件允許開(kāi)發(fā)人員在另一個(gè)應(yīng)用程序的上下文內(nèi)提供 Visio 功能。這種新級(jí)別的集成允許開(kāi)發(fā)人員完全控制與宿主應(yīng)用程序相結(jié)合的 Visio 用戶界面。該新增功能更為強(qiáng)大,而不僅僅是將 Visio 繪圖嵌入到 OLE 容器文檔(如 Word)中。將 Visio 繪圖用作 OLE 對(duì)象允許您查看容器應(yīng)用程序中的關(guān)系圖、將 OLE 對(duì)象鏈接到實(shí)際 Visio 文檔以反映更改以及通過(guò)從容器文檔內(nèi)激活 Visio 應(yīng)用程序來(lái)編輯 Visio 繪圖。
在就地 OLE 激活的情況下,您仍然工作于 Visio 用戶界面內(nèi)。您無(wú)法創(chuàng)建自己的 UI。無(wú)法通過(guò)使用包含應(yīng)用程序的自動(dòng)功能來(lái)以編程方式訪問(wèn) Visio 文檔。您還會(huì)受限于只能使用實(shí)現(xiàn) OLE 容器的應(yīng)用程序主機(jī),這樣就不能使用諸如 .NET Windows 窗體之類的技術(shù)。
但是,Visio 繪圖控件提供了解決這些情況的新功能,并且允許您開(kāi)發(fā)在以前不可能開(kāi)發(fā)的新 Visio 解決方案,例如本文以下 “使用 Visio 繪圖控件的場(chǎng)景” 部分中介紹的那些解決方案。
Visio 繪圖控件通過(guò) Visio 產(chǎn)品安裝發(fā)行。還有一個(gè)可用于對(duì) Visio 繪圖控件 API 進(jìn)行托管代碼訪問(wèn)的主 interop 程序集。如果要從托管代碼使用該控件,則必須安裝 Visio 主 interop 程序集。請(qǐng)參閱本文的“部署”部分以獲得有關(guān)安裝 Visio 繪圖控件和 Visio 主 interop 程序集的詳細(xì)信息。
使用 Visio 繪圖控件的場(chǎng)景
要演示 Visio 繪圖控件的實(shí)用性,請(qǐng)考慮以下客戶場(chǎng)景。
-
公司的行政部門為行政助理提供了一個(gè)辦公空間計(jì)劃應(yīng)用程序。Windows 窗體作為繪圖控件的宿主,顯示代表辦公室布局的區(qū)域。繪圖控件旁邊是代表辦公室家具的按鈕。當(dāng)行政助理單擊一個(gè)按鈕時(shí),就會(huì)在繪圖窗體上放置一個(gè)形狀,然后他可以在繪圖控件上重新定位該形狀以查看辦公室中的家具布置外觀。
Windows 窗體包含一個(gè)以 Visual Basic .NET 編寫的事件處理程序,它響應(yīng)添加的新形狀并且跟蹤家具選擇以生成采購(gòu)定單。通過(guò)在繪圖控件中刪除形狀,行政助理可以重新布置和取消家具選擇。因?yàn)樾姓硎菑拇绑w的 UI 來(lái)操縱繪圖畫面的,所以用戶無(wú)需熟悉 Visio 應(yīng)用程序。
-
一個(gè)管理團(tuán)隊(duì)正致力于制訂員工工作流程圖。為了有助于協(xié)作,該團(tuán)隊(duì)使用了 Microsoft Office SharePoint? Portal Server,它為團(tuán)隊(duì)文檔和工具提供了一個(gè)集中存儲(chǔ)點(diǎn),以便團(tuán)隊(duì)協(xié)作和共享文檔。經(jīng)理們并不熟悉繪圖工具,并且他們希望在 Microsoft Office Excel 電子表格中輸入工作步驟,然后讓 Visio 從這些數(shù)據(jù)中生成流程圖繪圖。而且,他們希望在同一瀏覽器頁(yè)面上查看所有的數(shù)據(jù)。
要實(shí)現(xiàn)這些要求,應(yīng)用程序開(kāi)發(fā)人員需修改 SharePoint 站點(diǎn)上的團(tuán)隊(duì)頁(yè)面,方法是添加顯示用于定義工作步驟的 Excel 電子表格的數(shù)據(jù)表 Web 部件。然后,開(kāi)發(fā)人員創(chuàng)建一個(gè)宿主繪圖控件的自定義 Web 部件。開(kāi)發(fā)人員將兩個(gè) Web 部件鏈接在一起,而在繪圖控件內(nèi)部會(huì)自動(dòng)生成源自 Excel 中的工作步驟信息的流程圖。如果某位經(jīng)理想要修改該流程圖,她可以編輯數(shù)據(jù)表 Web 部件中的行,然后刷新該流程圖形狀以反映所做的更改。該解決方案允許經(jīng)理們?cè)谕粸g覽器頁(yè)面內(nèi)使用他們最喜好的工具來(lái)完成所有的更新操作。
該控件可以讓您使用各種主機(jī)容器構(gòu)建如剛才介紹的事件驅(qū)動(dòng)應(yīng)用程序。您可以將繪圖畫面組件添加到現(xiàn)有的或規(guī)劃的應(yīng)用程序中,而不是構(gòu)建宿主于 Visio 應(yīng)用程序用戶界面中的解決方案。對(duì)于 Visio 繪圖控件,應(yīng)用程序通常會(huì)反映如圖 1?所示的體系結(jié)構(gòu)。
圖 1. 宿主 Visio 繪圖控件的應(yīng)用程序
在應(yīng)用程序中使用 Visio 繪圖控件提供以下優(yōu)點(diǎn):
-
Visio 繪圖控件運(yùn)行在應(yīng)用程序的進(jìn)程內(nèi),并且不要求運(yùn)行 Visio 應(yīng)用程序的單獨(dú)實(shí)例。
-
該控件針對(duì)每個(gè)實(shí)例顯示單個(gè) Visio 文檔和單個(gè)窗口。可以通過(guò)將多個(gè)控件實(shí)例嵌入到宿主應(yīng)用程序中來(lái)顯示多個(gè)文檔。Visio 繪圖控件還公開(kāi)了一個(gè)用于加載現(xiàn)有 Visio 文件的方法。
-
該控件允許用戶界面與宿主應(yīng)用程序相結(jié)合。開(kāi)發(fā)人員可以為不熟悉 Visio 的用戶提供簡(jiǎn)化的用戶界面。
-
宿主應(yīng)用程序可以通過(guò)嵌入控件實(shí)例來(lái)訪問(wèn) Visio Automation 屬性和方法。這允許宿主應(yīng)用程序以編程方式修改包含的 Visio 文檔。
-
該控件直接公開(kāi) Visio?Window?和?Document?事件。
您還可以使用托管代碼來(lái)開(kāi)發(fā) Visio 繪圖控件解決方案。托管代碼互操作性通過(guò) Visio 主 interop 程序集提供,這些程序集提供對(duì) Visio 繪圖控件 API 和 Visio Automation 庫(kù)的托管代碼訪問(wèn)。在出現(xiàn)該繪圖控件之前,對(duì)于托管代碼,只能使用托管語(yǔ)言編寫 COM 加載項(xiàng)或可執(zhí)行文件。使用該控件,您可以直接從應(yīng)用程序執(zhí)行 Visio Automation 代碼。這種集成允許您將 Windows 窗體用作應(yīng)用程序容器并且以托管語(yǔ)言(例如 Visual Studio C++、Visual.NET C# 或 Visual Basic .NET)編寫代碼。
設(shè)計(jì)最佳作法
因?yàn)?Visio 繪圖控件是可編程組件,您可以直接將 Visio 解決方案代碼集成到主機(jī)容器應(yīng)用程序中。在以前的 Visio 版本中,開(kāi)發(fā)人員為 Visio 客戶端應(yīng)用程序編寫解決方案時(shí),需要在 COM 加載項(xiàng)、Visio 解決方案庫(kù) (VSL)、進(jìn)程外可執(zhí)行文件或在文檔中的 Visual Basic for Applications (VBA) 項(xiàng)目中打包解決方案代碼。
通過(guò)允許從宿主應(yīng)用程序?qū)?Visio?Application?對(duì)象進(jìn)行編程,Visio 控件簡(jiǎn)化了解決方案體系結(jié)構(gòu)和開(kāi)發(fā)過(guò)程。在自定義應(yīng)用程序(例如 C# 應(yīng)用程序)或 Internet Explorer 中使用控件的開(kāi)發(fā)人員應(yīng)該直接針對(duì)宿主應(yīng)用程序中的 Visio 對(duì)象模型進(jìn)行編程,而不必將 Visio 邏輯分隔到 COM 加載項(xiàng)、VSL 或可執(zhí)行文件中。從宿主應(yīng)用程序中調(diào)用 Visio COM 加載項(xiàng)、VSL 或可執(zhí)行文件,使得 Visio 集成的調(diào)試復(fù)雜化了,這毫無(wú)必要。
但是,如果希望在 Microsoft Office System 應(yīng)用程序而不是在 Visio 中宿主 Visio 控件,則必須使用 COM 加載項(xiàng)。在這種情況下,為宿主應(yīng)用程序(而不是 Visio)創(chuàng)建一個(gè) COM 加載項(xiàng)。例如,如果您計(jì)劃將 Visio 控件宿主于 Microsoft Office Word 2003 文檔中,則創(chuàng)建一個(gè) Word COM 加載項(xiàng),然后通過(guò)該 Word 加載項(xiàng)訪問(wèn) Visio 控件。確保該主機(jī)的目標(biāo)是 COM 加載項(xiàng),因?yàn)?Office 宿主應(yīng)用程序?qū)⒉粫?huì)加載繪圖控件的 Visio COM 加載項(xiàng)。
使用控件主機(jī)限制
Visio 繪圖控件支持很多容器,其中包括構(gòu)建在 Visual Studio.NET 2003、Visual Studio 6.0、Internet Explorer 5.0 或更高版本、ASP.NET 以及其他 ActiveX 控件容器中的宿主應(yīng)用程序。但是,Visio 控件無(wú)法直接嵌入到:
-
另一個(gè) ActiveX 控件中,如 Internet Explorer 瀏覽器控件。
-
Visio 文檔。
-
Microsoft Office InfoPath? 2003 表單。
注?可以將 ActiveX 控件嵌入到 Visio 繪圖控件中(而不是將 Visio 繪圖控件嵌入另一個(gè) ActiveX 控件中)。但是,因?yàn)?Visio 繪圖控件無(wú)法在 Visio 文檔中執(zhí)行 VBA 代碼,所以最好將其他 ActiveX 控件集成到宿主應(yīng)用程序項(xiàng)目中,而不是集成到 Visio 文檔中。
將 Visio 控件用于 Internet Explorer 瀏覽器控件中
即使無(wú)法直接將 Visio 繪圖控件嵌入到另一個(gè) ActiveX 控件中,您仍然可以利用依賴于 Internet Explorer 瀏覽器控件的應(yīng)用程序來(lái)使用 Visio 繪圖控件。
Internet Explorer 5.0 或更高版本為 Visio 繪圖控件提供了非常優(yōu)秀的主機(jī)容器,允許開(kāi)發(fā)人員根據(jù) Microsoft Visual Basic Scripting Edition (VBScript) 中的 Visio 對(duì)象模型或者根據(jù)由 European Computer Manufacturers Association 規(guī)范定義的 ECMAScript 來(lái)編寫腳本,例如 JScript 或 JavaScript。
要將 Visio 繪圖控件與基于 Internet Explorer 瀏覽器控件的應(yīng)用程序相結(jié)合,例如 Microsoft Office Project Web Access 客戶端,請(qǐng)執(zhí)行以下操作:
在 Internet Explorer 瀏覽器控件中添加一個(gè)鏈接,該鏈接利用其自己的窗口啟動(dòng)新的 Internet Explorer 進(jìn)程。
將 Visio 繪圖控件嵌入到新的 Internet Explorer 窗口中以用于新的 Internet Explorer 進(jìn)程。
使用您喜歡的腳本語(yǔ)言根據(jù) Visio 繪圖控件進(jìn)行編程。
將 Visio 控件用于 Microsoft Office InfoPath 2003 中
盡管無(wú)法將 Visio 繪圖控件直接嵌入到 InfoPath 2003 表單,InfoPath 還是提供了包含 Internet Explorer 窗口的解決方案任務(wù)窗格。您可以將 Visio 繪圖控件直接嵌入到該 InfoPath 解決方案任務(wù)窗格窗口中,然后使用文檔對(duì)象模型 (DOM) 以在 Visio 繪圖和 InfoPath 表單之間共享數(shù)據(jù)。
了解 Visio 繪圖控件的 SDI
當(dāng)設(shè)計(jì)使用 Visio 繪圖控件的應(yīng)用程序時(shí),了解 Visio 控件在單個(gè)窗口中支持單個(gè)文件非常重要。由于該控件的單文檔界面 (SDI) 體系結(jié)構(gòu),所以在設(shè)計(jì)集成 Visio 繪圖控件與應(yīng)用程序時(shí)要考慮以下事項(xiàng):
-
**使用 Visio 繪圖控件的多個(gè)實(shí)例以在應(yīng)用程序中顯示多個(gè) Visio 文檔。**Visio 客戶端應(yīng)用程序可以同時(shí)顯示多個(gè)文檔和窗口,Visio 繪圖控件與其不同,它只能針對(duì)每個(gè)控件的實(shí)例顯示一個(gè)單一文檔。如果開(kāi)發(fā)人員要顯示多個(gè) Visio 文檔,開(kāi)發(fā)人員可將該控件的多個(gè)實(shí)例嵌入應(yīng)用程序,每個(gè)實(shí)例加載一個(gè)單獨(dú)的 Visio 文檔。
-
**不依賴于 VBA 對(duì)邏輯進(jìn)行編程。**VBA 沒(méi)有包括在 Visio 繪圖控件中。因此,在 Visio 繪圖控件中加載的文檔不會(huì)執(zhí)行任何與該文檔相關(guān)聯(lián)的 VBA 代碼。控件缺少 VBA 運(yùn)行時(shí)環(huán)境會(huì)阻止通過(guò)由 Visio 控件加載的文檔分發(fā)合法代碼或惡意宏。它還意味著作為控件宿主的應(yīng)用程序用戶將永遠(yuǎn)不會(huì)看到 Visio 應(yīng)用程序的警告有關(guān)文檔中的宏的安全對(duì)話框。
-
以編程方式使用 Visio ShapeSheet?**。**該控件不提供到 Visio ShapeSheet 用戶界面的訪問(wèn),該界面是 Visio 應(yīng)用程序中的獨(dú)立窗口。但是,ShapeSheet 本身仍然因?yàn)?Visio 繪圖控件中加載文檔中的 Visio 形狀和頁(yè)面而存在。您仍然可以使用Visio Automation 來(lái)編輯控件中 Visio 文檔的 ShapeSheet 單元格。例如,您可以使用?Cell?對(duì)象的?Src?屬性為 Visio 形狀添加雙擊操作。
注?對(duì)在控件中加載的文檔的 ShapeSheet 進(jìn)行編程時(shí),您將無(wú)法使用?CALLTHIS?函數(shù),該函數(shù)會(huì)調(diào)用文檔中的 VBA 宏。Visio 繪圖控件不執(zhí)行 VBA 代碼,因此所有對(duì)?CALLTHIS?函數(shù)的使用都會(huì)失敗,同時(shí)不會(huì)出現(xiàn)任何提示。但是,您可以使用 Visio?Page?和?Document?對(duì)象的鼠標(biāo)事件,并在自定義容器應(yīng)用程序邏輯中處理事件響應(yīng)。(有關(guān)鼠標(biāo)事件的詳細(xì)信息,請(qǐng)參閱“處理事件”。)如果您使用的是 COM 加載項(xiàng),則還可以使用 QUEUEMARKER 函數(shù)根據(jù) ShapeSheet 中的雙擊事件隊(duì)列 marker 事件。
遷移現(xiàn)有的 Visio 解決方案
在將代碼從現(xiàn)有的 Visio 客戶端應(yīng)用程序解決方案遷移到 Visio 控件時(shí),請(qǐng)將這些設(shè)計(jì)注意事項(xiàng)包括在您的計(jì)劃中。
-
**遷移 VBA 代碼。**您必須將所有現(xiàn)有的 VBA 代碼遷移到 COM 加載項(xiàng)中,或者最好是遷移到宿主應(yīng)用程序中。您可以保留大多數(shù)的相同算法和邏輯,只要它可以工作在控件的 SDI 體系結(jié)構(gòu)中。
-
**將現(xiàn)有的 Visio 解決方案 COM 加載項(xiàng)、可執(zhí)行文件或 VSL 遷移到容器應(yīng)用程序。**盡管利用宿主應(yīng)用程序使用現(xiàn)有 COM 加載項(xiàng)、可執(zhí)行文件或 VSL 最初可能會(huì)比較簡(jiǎn)單,但還是建議您直接將 Visio 繪圖控件編程直接與宿主應(yīng)用程序結(jié)合使用。在花時(shí)間將代碼從現(xiàn)有解決方案遷移到宿主應(yīng)用程序后,您將簡(jiǎn)化解決方案的部署,之后隨著時(shí)間推移會(huì)簡(jiǎn)化開(kāi)發(fā)、調(diào)試和維護(hù)過(guò)程。無(wú)需使用 COM 加載項(xiàng),除非您要使用另一個(gè) Office 容器中的控件。
-
**重新評(píng)估形狀中的數(shù)據(jù)存儲(chǔ)。**如果當(dāng)前的 Visio 解決方案在形狀中存儲(chǔ)了大量的數(shù)據(jù),請(qǐng)考慮將數(shù)據(jù)存儲(chǔ)從 Visio 形狀中提出并重新設(shè)計(jì)為由宿主應(yīng)用程序維護(hù)或訪問(wèn)的數(shù)據(jù)結(jié)構(gòu)。Visio 可以根據(jù)需要存儲(chǔ)任意多的數(shù)據(jù),但如果將 Visio 作為表示層組件并將宿主應(yīng)用程序用作數(shù)據(jù)存儲(chǔ)或通過(guò)它來(lái)訪問(wèn)數(shù)據(jù)源,則會(huì)更有意義。如果數(shù)據(jù)是相對(duì)靜態(tài)、但頻繁地用其來(lái)修改形狀的外觀和布局,那么將信息存儲(chǔ)在形狀自定義屬性中會(huì)更有意義。
-
**考慮將事件與宿主應(yīng)用程序結(jié)合。**與 Visio 客戶端應(yīng)用程序解決方案不同,Visio 繪圖界面可以響應(yīng)用戶事件和宿主應(yīng)用程序事件。請(qǐng)考慮您希望繪圖畫面如何響應(yīng)由宿主應(yīng)用程序激發(fā)的事件,以及您的宿主應(yīng)用程序需要如何響應(yīng) Visio 繪圖畫面中的事件。
-
**使用 COM 加載項(xiàng)的 marker 事件。**如果必須使用 COM 加載項(xiàng),則需要一種通知 COM 加載項(xiàng)響應(yīng)文檔中用戶操作的方法。使用 ShapeSheet 中 的 QUEUEMARKER 函數(shù)或文檔中持久性事件來(lái)排隊(duì) COM 加載項(xiàng)要響應(yīng)的 marker 事件。
啟動(dòng)新的 Visio 開(kāi)發(fā)
如果您只啟動(dòng)集成應(yīng)用程序的 Visio,則最好直接根據(jù)宿主應(yīng)用程序代碼中的 Visio 對(duì)象模型進(jìn)行編程。除了本文檔中的設(shè)計(jì)建議和實(shí)現(xiàn)指導(dǎo)外,還需參考以下資源以獲得有關(guān)使用 Visio 對(duì)象模型的信息:
-
Microsoft Office Visio Automation Reference?提供有關(guān) Visio 對(duì)象模型的技術(shù)文檔。
-
Microsoft Office Visio ShapeSheet Reference?提供有關(guān)可以通過(guò) Visio 對(duì)象模型進(jìn)行編程的 ShapeSheet 單元格和函數(shù)的技術(shù)文檔。
-
MSDN 上的 Visio 開(kāi)發(fā)人員中心?為所有級(jí)別的 Visio 開(kāi)發(fā)人員提供文章、教程和軟件開(kāi)發(fā)工具包 (SDK)。
開(kāi)始使用
本部分包含在應(yīng)用程序中使用 Visio 繪圖控件的基本步驟。它將說(shuō)明如何將控件嵌入到主機(jī)容器中、如何將 Visio 文檔加載到控件窗口并保存更改以及如何獲得對(duì) Visio?Application?對(duì)象的引用,以便您可以借助編程方式使用 Visio 文檔。
創(chuàng)建 Visio 繪圖控件實(shí)例
本部分將詳細(xì)說(shuō)明創(chuàng)建 Visio 繪圖控件實(shí)例和設(shè)置下列容器引用的過(guò)程:Windows 窗體、基于 Visual Basic 6.0 窗體的應(yīng)用程序、Office 文檔和 Internet Explorer。
注?開(kāi)發(fā)人員無(wú)法在設(shè)計(jì)階段激活 Visio 控件中的 Visio 繪圖。控件中的 Visio 繪圖只能在運(yùn)行時(shí)激活。
以托管代碼方式創(chuàng)建 Visio 繪圖控件實(shí)例
您可以輕松地以托管代碼方式創(chuàng)建 Visio 繪圖控件實(shí)例。
完成這個(gè)過(guò)程以將下列程序集引用添加到項(xiàng)目中:
-
VisioOcx?Visio 繪圖控件主 interop 程序集。
-
Visio?Visio 類型庫(kù)主 interop 程序集。
-
AxVisOcx?允許控件嵌入到 Windows 窗體中的 ActiveX 控件包裝程序集。Windows 窗體 ActiveX 控件導(dǎo)入程序 (Aximp.exe) 會(huì)自動(dòng)生成這個(gè)程序集并將其添加到項(xiàng)目中。這個(gè)包裝程序集必須與應(yīng)用程序一起重新發(fā)布。窗體上的多個(gè) Visio 繪圖控件實(shí)例共享派生自?AxHost?類的相同包裝類。
要將 Visio 繪圖控件添加到 Windows 窗體:
在 Visual Studio .NET 中,在設(shè)計(jì)模式中顯示 Windows 窗體。單擊工具箱。
在工具箱內(nèi)右鍵單擊,然后選擇?Add/Remove Items?打開(kāi)?Customize Toolbox?對(duì)話框。
單擊?Customize Toolbox?對(duì)話框中的?COM Components?選項(xiàng)卡。為類型庫(kù)選中?Microsoft Visio Drawing Control,如圖 2?所示。
圖 2. 將 Visio 繪圖控件添加到 Visual Studio .NET 工具箱中
單擊?OK。Visio 繪圖控件現(xiàn)在出現(xiàn)在工具箱中,如圖 3?所示。
圖 3. Visual Studio .NET 工具箱中的 Visio 繪圖控件
通過(guò)在工具箱中雙擊 Visio 繪圖控件,或者單擊 Visio 繪圖控件然后將其拖動(dòng)到窗體,可以將該控件添加到窗體。
在 Visual Basic 6.0 中創(chuàng)建 Visio 繪圖控件實(shí)例
您可以簡(jiǎn)單地使用 Visual Basic 6.0 來(lái)創(chuàng)建 Visio 繪圖控件實(shí)例。完成這個(gè)過(guò)程以將引用添加到 Visio 繪圖控件類型庫(kù)。如果要以編程方式更改包含在繪圖控件實(shí)例中的 Visio 文檔,則需要添加一個(gè)對(duì) Microsoft Visio 11.0 類型庫(kù)的引用。
要將 Visio 繪圖控件添加到 Visual Basic 6.0 窗體:
在 Visual Basic 6.0 中,在設(shè)計(jì)模式中顯示窗體,右鍵單擊工具箱,然后選擇?Components。
在?Components?對(duì)話框中的?Controls?選項(xiàng)卡上,選中 Microsoft?Visio Drawing Control 11.0,如圖 4?所示。
圖 4. 將 Visio 繪圖控件添加到 Visual Basic 6.0 工具箱中
單擊?OK。Visio 繪圖控件現(xiàn)在出現(xiàn)在工具箱中。
圖 5. Visual Basic 6.0 工具箱中的 Visio 繪圖控件
通過(guò)在工具箱中雙擊 Visio 繪圖控件,或者單擊 Visio 繪圖控件然后將其拖動(dòng)到窗體,可以將該控件添加到窗體。
在 Microsoft Office System 應(yīng)用程序文檔中創(chuàng)建 Visio 繪圖控件
完成這個(gè)過(guò)程以將引用添加到 Visio 繪圖控件類型庫(kù)。如果要以編程方式更改包含在繪圖控件實(shí)例中的 Visio 文檔,則需要添加一個(gè)對(duì) Microsoft Visio 11.0 類型庫(kù)的引用。
要將 Visio 繪圖控件添加到 Office 應(yīng)用程序文檔中:
右鍵單擊 Office 應(yīng)用程序的工具欄,然后選擇?Control Toolbox。
在?Control Toolbox?工具欄上,單擊?More Controls?按鈕,然后選中?Microsoft Visio Drawing Control,如圖 6?所示:
圖 6. 將 Visio 繪圖控件添加到 Microsoft Office Word 工具箱中
在將 Visio 繪圖控件插入到 Office 應(yīng)用程序文檔后,可以通過(guò)右鍵單擊它,然后選擇?Properties?來(lái)查看其屬性。如果要從文檔的 Visual Basic 項(xiàng)目中以編程方式訪問(wèn) Visio 繪圖控件,那么右鍵單擊該控件,然后選擇?View Code。
在 Internet Explorer 中創(chuàng)建 Visio 繪圖控件實(shí)例
要將 Visio 繪圖控件添加到 Web 窗體或 HTML 頁(yè),您要遵循“以托管代碼方式創(chuàng)建 Visio 繪圖控件實(shí)例”中的步驟,不同之處在于您要將 Visio 繪圖控件拖動(dòng)到 Web 頁(yè)上,而不是 Windows 窗體上。Visual Studio .NET 將下面的 HTML 添加到 Web 頁(yè):
修改?Properties?窗口中的值以更新 Visio 繪圖控件實(shí)例中的屬性標(biāo)記。例如,如果修改?Src?屬性,Visual Studio .NET 會(huì)生成類似于下面的標(biāo)記:
將 Visio 繪圖控件宿主為客戶端對(duì)象,并為腳本語(yǔ)言(例如,VBScript)支持限量屬性。您可以編寫腳本對(duì) Visio 繪圖控件所公開(kāi)的屬性進(jìn)行更改。但是,您無(wú)法使用腳本語(yǔ)言訪問(wèn) Visio 對(duì)象模型,這意味著您無(wú)法以編程方式更改由控件顯示的 Visio 文檔。用戶可以通過(guò)單擊繪圖畫面對(duì) Visio 文檔進(jìn)行更改。
注?該控件將只初始化任意給定的 Internet Explorer 進(jìn)程中的第一個(gè)線程。如果您希望在基于 Internet Explorer 的應(yīng)用程序中使用該控件的多個(gè)實(shí)例,請(qǐng)為該控件的每個(gè)額外的實(shí)例創(chuàng)建一個(gè)新的 Internet Explorer 進(jìn)程,然后在新的 Internet Explorer 進(jìn)程中加載包含該控件的 HTML 頁(yè)。
獲得對(duì) Visio 應(yīng)用程序?qū)ο蟮囊?/h4>
您可以通過(guò) Visio 繪圖控件的 API 來(lái)訪問(wèn) Visio 對(duì)象模型。要獲得對(duì) Visio?Application?對(duì)象的引用,請(qǐng)使用繪圖控件的?Document?或?Window?屬性。
例如,下面的 C# 代碼說(shuō)明如何使用該繪圖控件的?Window?屬性以獲得對(duì) Visio?Application?對(duì)象的引用。
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 代碼來(lái)完成相同的任務(wù):
Dim vsoApplication As Visio.Application Set vsoApplication = DrawingControl.Window.Application管理文檔
當(dāng)加載 Visio 繪圖控件時(shí),將會(huì)顯示一個(gè)空白 Visio 繪圖。如果希望顯示現(xiàn)有的 Visio 文檔,則繪圖控件會(huì)公開(kāi)一個(gè)?Src?屬性以便將文檔加載到控件中。然后,您可以使用文檔的?SaveAs?方法保存所有更改。
加載 Visio 文檔
使用 Visio 繪圖控件的?Src?屬性來(lái)將文檔加載到該控件。例如,下面的 C# 示例將顯示如何加載 Visio 繪圖:
drawingControl.Src = "C:\\Drawing.vsd";可以使用?Src?屬性加載任意 Visio 文件類型(例如,.vsd、.vdx、.vst 或 .svg)。可以本地存儲(chǔ)該文件或?qū)⑵浯鎯?chǔ)在遠(yuǎn)程文件服務(wù)器上。
Visio 控件的?Src?屬性會(huì)加載在?Src?值中指定的文件副本。要將更改保存在控件的文檔中,必須使用?SaveAs?方法來(lái)保存 Visio 文檔。或者,還可以保存流中的更改。但是,在這兩種情況下,都不能修改由?Src?屬性加載的原始文檔。
將 Visio 文檔保存到文件
該控件加載由?Src?屬性指定的文件副本。通過(guò) SRC 加載的文件不能用于讀取/寫入操作,因此無(wú)法使用?Save?方法保存。要將更改保存到 Visio 繪圖控件中加載的文檔,請(qǐng)調(diào)用文檔的?SaveAs?方法。下面的 C# 示例將說(shuō)明如何使用繪圖控件的?Document?屬性來(lái)調(diào)用?SaveAs?方法:
Visio.Document document = drawingControl.Document; document.SaveAs("C:\\Drawing.vsd");您無(wú)法使用?SaveAsEx?方法將 Visio 2003 文檔保存到 Visio ActiveX 控件中的 Visio 2002 格式。要將 Visio 繪圖控件中加載的繪圖保存到 Visio 2002 格式,請(qǐng)啟動(dòng)一個(gè) Visio 的不可見(jiàn)實(shí)例,并在 Visio 應(yīng)用程序?qū)嵗姓{(diào)用?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 文檔保存到流
開(kāi)發(fā)人員可能要將更改保存到 Visio 繪圖控件的繪圖中,而無(wú)需將繪圖保存到磁盤中。例如,如果用戶修改 Word 文檔中嵌入控件中的 Visio 文檔,那么當(dāng)用戶將該 Word 文檔以電子郵件消息形式轉(zhuǎn)發(fā)時(shí),所做的更改會(huì)丟失。當(dāng)另一個(gè)用戶打開(kāi)該文檔時(shí),該控件會(huì)加載由?Src?屬性指定的文件,覆蓋所有修改。
要將流中的更改保存到控件中的 Visio 文檔:
使用 Visio 控件的?Src?屬性加載原始文檔。
在加載該文檔后,將?Src?屬性設(shè)置為空字符串。
當(dāng)控件在第一次初始化后在其容器文檔中激活時(shí),該控件會(huì)顯示最后一個(gè)流中的圖像,而不顯示由?Src?屬性指定的原始文檔。
使用控件中的空白文檔
要在第一次初始化該控件時(shí)將空白繪圖加載到其中,請(qǐng)將?Src?屬性設(shè)置為空字符串。但是,如果希望在加載現(xiàn)有繪圖文檔后在控件中模擬創(chuàng)建新的空白繪圖,則有三種選擇:
-
全選并刪除繪圖中所有形狀。該方法允許開(kāi)發(fā)人員將所有現(xiàn)有樣式保留在當(dāng)前加載的文檔中。
-
使用?Src?屬性加載新的空白文檔。
-
動(dòng)態(tài)破壞并重新初始化文檔中的 Visio 繪圖控件。
將控件與主機(jī)容器相結(jié)合
您可以修改應(yīng)用程序中的 Visio 繪圖控件的外觀。默認(rèn)情況下,關(guān)閉所有 Visio 工具欄,并且不顯示模具窗格。您可以選擇通過(guò)顯示滾動(dòng)條、標(biāo)尺或者更改窗口背景顏色來(lái)選擇繪圖控件畫面出現(xiàn)的方式。
繪圖控件公開(kāi)一個(gè)?PageSizingBehavior?屬性,該屬性確定頁(yè)面在繪圖控件窗口內(nèi)顯示的方式。您可以選擇調(diào)整與繪圖控件大小相關(guān)的頁(yè)面,或者提供類似于 Visio 的視圖,以顯示部分繪圖頁(yè)面。
因?yàn)樵摽丶恢С謫蝹€(gè)窗口,所以無(wú)法訪問(wèn) ShapeSheet 或諸如圖標(biāo)編輯器以及主控和分組編輯之類的窗口。默認(rèn)情況下,啟用頁(yè)面和形狀的右鍵單擊菜單。控制形狀行為的有限 Visio UI 會(huì)反映要與容器應(yīng)用程序緊密結(jié)合的控件的意圖。允許用戶修改文檔上形狀的最佳方法就是使用自定義的 UI。但是,如果您希望使用 Visio 菜單和工具欄,則繪圖控件確實(shí)支持與宿主應(yīng)用程序結(jié)合的菜單和工具欄。
最具可能的是,Visio 繪圖控件應(yīng)用程序會(huì)由事件驅(qū)動(dòng),并且響應(yīng)包含在應(yīng)用程序中的用戶單擊按鈕或菜單項(xiàng)。該繪圖控件還公開(kāi) Visio 事件,以便您可以在控件本身內(nèi)響應(yīng)用戶單擊。
管理繪圖畫面顯示
您可以通過(guò)控件的?Window?屬性修改 Visio 繪圖控件表面的外觀。例如,下面的 C# 代碼將隱藏繪圖控件的滾動(dòng)條:
drawingControl.Window.ShowScrollBars = (short)_ Visio.VisScrollbarStates.visScrollBarNeither;這個(gè)示例同時(shí)隱藏水平和垂直滾動(dòng)條。VisScrollbarStates?枚舉的其他可能值包括?visScrollBarBoth(同時(shí)顯示兩個(gè)滾動(dòng)條)、visScrollBarHoriz(顯示水平滾動(dòng)條)和?visScrollBarVert(顯示垂直滾動(dòng)條)。
通過(guò)移除部分 Visio UI,您可以使得繪圖控件看起來(lái)與應(yīng)用程序結(jié)合的更緊密。下面的 C# 代碼將隱藏標(biāo)尺:
drawingControl.Window.ShowRulers = 0;還可以更改窗口的背景顏色以適合應(yīng)用程序的配色方案。例如,下面的 C# 代碼會(huì)將窗口的背景顏色設(shè)置為純紅色:
drawingControl.Window.BackgroundColor = (uint) ColorTranslator.ToOle(Color.Red); drawingControl.Window.BackgroundColorGradient = (uint) ColorTranslator.ToOle(Color.Red);在此示例中,ColorTranslator?類用于將 .NET 顏色類型轉(zhuǎn)換成?OLE_COLOR?類型,這就是 Visio Automation 指定顏色的方式。
Visio 控件的用戶設(shè)置
Visio 繪圖控件將相同的基本?Application?對(duì)象共享為 Visio 客戶端應(yīng)用程序。因此,如果用戶更改 Visio 客戶端應(yīng)用程序的應(yīng)用程序設(shè)置(例如將頁(yè)面背景更改為藍(lán)色),那么在宿主應(yīng)用程序中運(yùn)行時(shí),相同的設(shè)置將會(huì)應(yīng)用到 Visio 控件。Visio 控件的?HostID?屬性允許您在注冊(cè)表中存儲(chǔ)該控件的不同用戶設(shè)置。要設(shè)置?HostID?屬性,請(qǐng)使用字符串來(lái)指示將要在?[HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\VisioHosts]?項(xiàng)中創(chuàng)建的子項(xiàng)的名稱。盡管可以為控件的子項(xiàng)的名稱使用任意字符串,但最好使用 GUID 來(lái)確保唯一性。
HostID?屬性可以在設(shè)計(jì)階段在控件的?Properties?窗口中進(jìn)行設(shè)置,也可以借助編程方式在宿主應(yīng)用程序代碼中進(jìn)行設(shè)置。
頁(yè)面調(diào)整和縮放
使用 Visio 繪圖控件的?PageSizingBehavior?屬性根據(jù)控件窗口調(diào)整頁(yè)面的大小。該屬性 (visNeverResizePages) 的默認(rèn)設(shè)置提供的視圖類似于 Visio 的視圖,可在該窗口內(nèi)查看視圖中頁(yè)面的一部分。下面的 C# 代碼示例調(diào)整頁(yè)面大小以適配該控件:
drawingControl.PageSizingBehavior = Visio.VisPageSizingBehaviors.visResizePages;當(dāng)?PageSizingBehavior?設(shè)置為?visResizePages?時(shí),該頁(yè)面的形狀將不會(huì)根據(jù)該頁(yè)面進(jìn)行調(diào)整。形狀會(huì)保留在 Visio 頁(yè)面坐標(biāo)系統(tǒng)的相對(duì)位置,其原點(diǎn)位于頁(yè)面的左下角。在控件內(nèi)調(diào)整頁(yè)面的大小進(jìn)行適配會(huì)隱藏頁(yè)邊界,在控件調(diào)整到繪圖畫面的最大區(qū)域時(shí),這一點(diǎn)會(huì)非常有用。
要在繪圖控件窗口中重新調(diào)整整個(gè)頁(yè)面(包括其形狀),請(qǐng)通過(guò)控件的?Window?屬性設(shè)置?Zoom?屬性,如下面的 C# 示例所示:
drawingControl.Window.Zoom = 2.0;該代碼將窗口的內(nèi)容放大到 200%。要使其生效,必須在使用?Src?屬性加載文檔后對(duì)縮放設(shè)置進(jìn)行設(shè)置。
要防止用戶更改縮放設(shè)置,請(qǐng)?jiān)O(shè)置?ZoomLock?屬性,如下面 C# 示例所示:
drawingControl.Window.ZoomLock = true;通過(guò)?VisZoomBehavior?屬性可以設(shè)置 Visio 所控制的縮放的最大范圍,該屬性可以通過(guò)繪圖控件的?Window?或?Document?屬性進(jìn)行訪問(wèn)。默認(rèn)情況下,該控件使用文檔的當(dāng)前縮放設(shè)置。如果希望能夠?qū)⒖s放設(shè)置到任意級(jí)別,不要只設(shè)置為不連續(xù)設(shè)置(例如,50% 或 100%),在不對(duì)外觀進(jìn)行任何調(diào)整的情況下,可將?VisZoomBehavior?屬性設(shè)置為?VisZoomVisioExact?值,如下面的 C# 示例所示:
drawingControl.Window.ZoomBehavior = Visio.VisZoomBehavior.visZoomVisioExact;注?無(wú)法在 Word 文檔中調(diào)整 Visio 繪圖控件大小。如果要調(diào)整繪圖控件大小并保存更改,則在下一次打開(kāi)該 Word 文檔時(shí)該控件將重置為其默認(rèn)大小。
形狀搜索窗口管理
您可以使用 Visio?ItemFromID?屬性“關(guān)閉”文檔的模具窗格中的 Visio 形狀搜索窗口。要使形狀搜索窗口在模具窗格中不可見(jiàn),請(qǐng)將該屬性的?Visible?屬性設(shè)置為 false,例如:
Windows(1).ItemFromID(Visio.visWinIDShapeSearch).Visible = False要在模具窗格中顯示形狀搜索窗口,請(qǐng)將相同的值設(shè)置為?True。
注?您只能管理基于每個(gè)窗口的形狀搜索窗口的可見(jiàn)性。
集成菜單和工具欄
在使用 Visio 繪圖控件構(gòu)建應(yīng)用程序時(shí)的最佳作法就是實(shí)現(xiàn)一個(gè)自定義 UI。如果您希望在容器應(yīng)用程序中顯示 Visio 菜單和工具欄,請(qǐng)?jiān)O(shè)置繪圖控件的?NegotatiateToolbars?和?NegotiateMenus?屬性。下面的 C# 代碼同時(shí)啟用菜單和工具欄合并:
drawingControl.NegotiateMenus = True; drawingControl.NegotiateToolbars = True;最佳作法是將這兩個(gè)參數(shù)設(shè)置為相同的值。該控件將不支持工具欄和菜單的獨(dú)立協(xié)商。
容器應(yīng)用程序必須支持 OLE 菜單合并以便顯示 Visio 菜單或工具欄。例如,您可以在 Word 文檔中啟用工具欄合并。在 Word 文檔的 Visual Basic 項(xiàng)目中,您可以借助編程方式顯示 Visio 工具欄。下面的示例將顯示?Layout & Routing?工具欄。
vsoApplication.CommandBars("Layout & Routing").Visible = True重要說(shuō)明?請(qǐng)勿嘗試將菜單和工具欄與 ActiveX 控件的多個(gè)活動(dòng)實(shí)例合并。該控件的多個(gè)實(shí)例共享單個(gè)基本 Visio?Application?對(duì)象。在嘗試將菜單與單個(gè)?Application?對(duì)象和該控件的多個(gè)活動(dòng)實(shí)例合并在一起時(shí),可能會(huì)得到意外結(jié)果。
要要說(shuō)明?請(qǐng)勿將菜單和工具欄與 Internet Explorer 用戶界面合并。在 Internet Explorer 中合并菜單存在著已知的問(wèn)題(請(qǐng)參閱 Microsoft 知識(shí)庫(kù)文章 193098?PRB:Unexpected Menu Merging Behavior in Internet Explorer)。
非 OLE 菜單合并主機(jī)的菜單和工具欄集成
如果您的容器不支持 OLE 菜單合并(例如,Windows 窗體),您可以使用?IOleCommandTarget?接口運(yùn)行 Visio 命令。您可以實(shí)現(xiàn)自己的菜單項(xiàng)和工具欄按鈕,如下面的 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);} }在創(chuàng)建菜單項(xiàng)后,請(qǐng)使用?IOleCommandTarget?接口將適當(dāng)?shù)?Visio 用戶界面命令用于該目標(biāo)。下面的示例在單擊菜單項(xiàng)時(shí)會(huì)啟用?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 事件的使用更為簡(jiǎn)便,Visio 繪圖控件對(duì)象將公開(kāi)所有 Visio?Window?和?Document?事件。這允許開(kāi)發(fā)人員可以直接從該控件訪問(wèn)這些事件,而無(wú)需通過(guò) Visio?Document?對(duì)象。
鼠標(biāo)和鍵盤事件通常用于 Visio 控件編程中。您可以在 Visio 繪圖控件上使用鼠標(biāo)事件來(lái)顯示自定義的 Windows 窗體以及更新宿主應(yīng)用程序中的數(shù)據(jù)。
如果希望“鎖定”Visio 控件的繪圖畫面,并防止最終用戶直接修改繪圖中的任何內(nèi)容,您可以偵聽(tīng)所有鍵盤和鼠標(biāo)事件并“丟棄這些事件”。如果宿主應(yīng)用程序“抑制”了鼠標(biāo)和鍵盤事件,則 Visio 繪圖畫面將不會(huì)響應(yīng)用戶的鍵入和鼠標(biāo)單擊操作。
鼠標(biāo)和鍵盤事件對(duì)象
由 Visio?AddAdvise?方法創(chuàng)建的事件對(duì)象提供了最佳的性能。您可以像使用任何其他 Visio 事件一樣,將 Visio 鼠標(biāo)和鍵盤事件與?AddAdvise?一起使用。
下面的代碼示例將演示如何使用 Visual Basic 6.0 中的事件接收器來(lái)捕獲鼠標(biāo)事件:
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 VariantDim strMessage As String' Determine if mouse up event fired.If nEventCode = visEvtCodeMouseUp ThenMsgBox ("MouseUp coordinates (" & pSubjectObj.X & ", " _& pSubjectObj.Y & ")")End IfEnd Function下面的代碼示例說(shuō)明如何使用?AddAdvise?方法來(lái)創(chuàng)建鼠標(biāo)對(duì)象的事件對(duì)象。
Private mEventSink As clsEventSink Dim vsoMouseUpEvent As Visio.Event Dim vsoWindowEvents As Visio.EventListSet mEventSink = New clsEventSinkSet vsoWindowEvents = DrawingControl1.Window.EventListSet vsoMouseUpEvent = vsoWindowEvents.AddAdvise( _visEvtCodeMouseUp, mEventSink, "", "Mouse up...")委托鼠標(biāo)單擊事件
盡管使用?AddAdvise?創(chuàng)建的事件對(duì)象提供了最佳性能,您還可以在 Windows 窗體中定義 C# 委托來(lái)處理繪圖控件窗口內(nèi)的鼠標(biāo)單擊事件,如下所示:
this.drawingControl.MouseUpEvent += new AxMicrosoft.Office.Interop.VisOcx.EVisOcx_MouseUpEventHandler(this.drawingControl_MouseUpEvent);然后事件處理程序?qū)?huì)具有以下簽名:
private void drawingControl_MouseUpEvent(object sender, AxVisOcx.EVisOcx_MouseUpEvent eventData)形狀的鼠標(biāo)事件
Visio 鼠標(biāo)事件在?Page?和?Window?對(duì)象上公開(kāi)。要定位用戶單擊的頁(yè)面或窗口中的特定形狀,開(kāi)發(fā)人員必須使用 Visio?SpatialSearch?方法。下面的 C# 代碼傳入窗口上單擊事件的 x- 和 y- 坐標(biāo)、設(shè)置指示出如何建立選擇對(duì)象的 Visio 常量,然后定義一個(gè)在 x- 和 y- 坐標(biāo)周圍進(jìn)行搜索的較小容錯(cuò)范圍。
MySelection = Window.SpatialSearch(x, y, visSpatialContainedIn, 0.001, visSpatialFrontToBack)如果將該容錯(cuò)設(shè)置為相對(duì)于形狀大小而言非常小的單位,則?SpatialSearch?方法返回的選擇對(duì)象將只包含一個(gè)形狀,即最終用戶在該窗口內(nèi)單擊的形狀。
部署
Visio 繪圖控件是通過(guò) Visio 產(chǎn)品安裝過(guò)程進(jìn)行發(fā)行的。這樣,就不會(huì)有關(guān)于控件本身的附加許可問(wèn)題了。宿主繪圖控件的應(yīng)用程序只有在 Visio 安裝到計(jì)算機(jī)上之后才能工作。
Visio 繪圖控件是作為?Minimal Install?選項(xiàng)的組成部分進(jìn)行安裝的。如果您的應(yīng)用程序是以托管代碼編寫的,并且要利用 Visio 主 interop 程序集,則必須選擇?Typical Install?選項(xiàng)才能安裝 Visio 主 interop 程序集。
首先,確保該計(jì)算機(jī)已經(jīng)安裝了 .NET Framework 1.1;否則 Visio 主 interop 程序集將無(wú)法安裝。.NET Framework 1.1 是隨 Visual Studio .NET 2003 安裝的版本。對(duì)于運(yùn)行應(yīng)用程序的客戶端來(lái)說(shuō),還可以安裝作為應(yīng)用程序的安裝程序組成部分的免費(fèi) .NET Framework 1.1 Redistributable。
此處有兩個(gè)選項(xiàng)可用于通過(guò) Visio 產(chǎn)品安裝程序自動(dòng)部署 Visio 繪圖控件:
-
編寫 Windows Installer 安裝程序,并為公司部署使用“無(wú)提示安裝”。
-
直接調(diào)用 Visio 產(chǎn)品 Windows Installer 軟件包(Visio .msi 文件)。
下面的示例說(shuō)明如何使用 Windows 腳本主機(jī)來(lái)利用?Typical Install?選項(xiàng)以無(wú)提示方式安裝 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")小結(jié)
Visio 繪圖控件允許開(kāi)發(fā)人員以豐富的 Visio 繪圖功能來(lái)擴(kuò)展自定義應(yīng)用程序和解決方案。通過(guò)提供對(duì)控件的編程功能以及對(duì)完整 Visio 對(duì)象模型的訪問(wèn),Visio 組件可以由用戶繪圖操作或宿主應(yīng)用程序中的事件和數(shù)據(jù)來(lái)驅(qū)動(dòng)。使用 Visio 繪圖控件的解決方案的優(yōu)點(diǎn)在于:
-
自定義應(yīng)用程序的用戶無(wú)需具備 Visio 用戶界面的知識(shí)就可以創(chuàng)建繪圖。應(yīng)用程序 UI 可以驅(qū)動(dòng)繪圖創(chuàng)建,并可以對(duì)用戶的 Visio 特定任務(wù)進(jìn)行概要。
-
對(duì)于應(yīng)用程序宿主和開(kāi)發(fā)工具的選擇,Visio 解決方案開(kāi)發(fā)人員的選擇范圍更為寬廣。Visio 繪圖控件可以宿主于任意 ActiveX 容器中。通過(guò)使用 Visio 主 interop 程序集,還可以使用托管代碼中的 Visio 繪圖控件來(lái)開(kāi)發(fā)解決方案。
-
與涉及 COM 加載項(xiàng)或 VSL 的解決方案相比,提供對(duì) Visio 編程模型的直接訪問(wèn)使得使用 Visio 繪圖控件的解決方案更易于開(kāi)發(fā)和調(diào)試。
關(guān)于作者
Mark Bukovec 是一位自由開(kāi)發(fā)人員和技術(shù)作家。之前,Mark 曾在 Microsoft 工作過(guò)五年,最近是為 COM+ 組工作的程序經(jīng)理。您可以通過(guò)?*empiredown@hotmail.com*?聯(lián)系 Mark。
轉(zhuǎn)到原英文頁(yè)面
轉(zhuǎn)載于:https://www.cnblogs.com/Joezhang433/p/10386692.html
總結(jié)
以上是生活随笔為你收集整理的以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PowerPoint教程资源专题资源免费
- 下一篇: directx9 截屏