日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件

發布時間:2023/12/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以編程方式使用 Microsoft Office Visio 2003 ActiveX 控件

Mark Bukovec
Empire Down Development

適用于:
Microsoft? Office Visio? 2003

**摘要:**學習將 Microsoft? Office Visio? 2003 ActiveX? 控件(即 Visio 繪圖控件)集成到應用程序中。查看最佳作法以及如何以編程方式使用 Visio 繪圖控件。

本頁內容

?簡介
?了解 Visio 繪制控件
?使用 Visio 繪圖控件的場景
?設計最佳作法
?開始使用
?將控件與主機容器相結合
?部署
?小結

簡介

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 的屬性。

  • 如何將 Visio 文檔加載到繪圖控件窗口并保存更改。

  • 如何獲得對 Visio?Application?對象的引用,以便以編程方式使用 Visio 文檔。

  • 如何管理繪圖畫面的顯示。

  • 如何將控件與宿主應用程序用戶界面相結合。

  • 如何利用應用程序部署 Visio 繪圖控件。

了解 Visio 繪制控件

Visio 繪圖控件將在組件中提供 Visio 應用程序對象模型的功能。Visio 繪圖控件可以嵌入使用 Microsoft Visual Studio?.NET 2003、Microsoft Office XP 和 Microsoft Office 2003 容器(如 Microsoft Office Word 2003、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 繪圖控件的場景

要演示 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 2003、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 控件用于 Internet Explorer 瀏覽器控件中

即使無法直接將 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 控件用于 Microsoft Office InfoPath 2003 中

    盡管無法將 Visio 繪圖控件直接嵌入到 InfoPath 2003 表單,InfoPath 還是提供了包含 Internet Explorer 窗口的解決方案任務窗格。您可以將 Visio 繪圖控件直接嵌入到該 InfoPath 解決方案任務窗格窗口中,然后使用文檔對象模型 (DOM) 以在 Visio 繪圖和 InfoPath 表單之間共享數據。

    了解 Visio 繪圖控件的 SDI

    當設計使用 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 客戶端應用程序解決方案遷移到 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 對象模型進行編程。除了本文檔中的設計建議和實現指導外,還需參考以下資源以獲得有關使用 Visio 對象模型的信息:

    • Microsoft Office Visio Automation Reference?提供有關 Visio 對象模型的技術文檔。

    • Microsoft Office Visio ShapeSheet Reference?提供有關可以通過 Visio 對象模型進行編程的 ShapeSheet 單元格和函數的技術文檔。

    • MSDN 上的 Visio 開發人員中心?為所有級別的 Visio 開發人員提供文章、教程和軟件開發工具包 (SDK)。

    開始使用

    本部分包含在應用程序中使用 Visio 繪圖控件的基本步驟。它將說明如何將控件嵌入到主機容器中、如何將 Visio 文檔加載到控件窗口并保存更改以及如何獲得對 Visio?Application?對象的引用,以便您可以借助編程方式使用 Visio 文檔。

    創建 Visio 繪圖控件實例

    本部分將詳細說明創建 Visio 繪圖控件實例和設置下列容器引用的過程:Windows 窗體、基于 Visual Basic 6.0 窗體的應用程序、Office 文檔和 Internet Explorer。

    注?開發人員無法在設計階段激活 Visio 控件中的 Visio 繪圖。控件中的 Visio 繪圖只能在運行時激活。

    以托管代碼方式創建 Visio 繪圖控件實例

    您可以輕松地以托管代碼方式創建 Visio 繪圖控件實例。

    完成這個過程以將下列程序集引用添加到項目中:

    • VisioOcx?Visio 繪圖控件主 interop 程序集。

    • Visio?Visio 類型庫主 interop 程序集。

    • AxVisOcx?允許控件嵌入到 Windows 窗體中的 ActiveX 控件包裝程序集。Windows 窗體 ActiveX 控件導入程序 (Aximp.exe) 會自動生成這個程序集并將其添加到項目中。這個包裝程序集必須與應用程序一起重新發布。窗體上的多個 Visio 繪圖控件實例共享派生自?AxHost?類的相同包裝類。

    要將 Visio 繪圖控件添加到 Windows 窗體:

  • 在 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 繪圖控件實例

    您可以簡單地使用 Visual Basic 6.0 來創建 Visio 繪圖控件實例。完成這個過程以將引用添加到 Visio 繪圖控件類型庫。如果要以編程方式更改包含在繪圖控件實例中的 Visio 文檔,則需要添加一個對 Microsoft Visio 11.0 類型庫的引用。

    要將 Visio 繪圖控件添加到 Visual Basic 6.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 繪圖控件然后將其拖動到窗體,可以將該控件添加到窗體。

  • 在 Microsoft Office System 應用程序文檔中創建 Visio 繪圖控件

    完成這個過程以將引用添加到 Visio 繪圖控件類型庫。如果要以編程方式更改包含在繪圖控件實例中的 Visio 文檔,則需要添加一個對 Microsoft Visio 11.0 類型庫的引用。

    要將 Visio 繪圖控件添加到 Office 應用程序文檔中:

  • 右鍵單擊 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。

    在 Internet Explorer 中創建 Visio 繪圖控件實例

    要將 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 應用程序對象的引用

    您可以通過 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 文檔

    使用 Visio 繪圖控件的?Src?屬性來將文檔加載到該控件。例如,下面的 C# 示例將顯示如何加載 Visio 繪圖:

    drawingControl.Src = "C:\\Drawing.vsd";

    可以使用?Src?屬性加載任意 Visio 文件類型(例如,.vsd、.vdx、.vst 或 .svg)。可以本地存儲該文件或將其存儲在遠程文件服務器上。

    Visio 控件的?Src?屬性會加載在?Src?值中指定的文件副本。要將更改保存在控件的文檔中,必須使用?SaveAs?方法來保存 Visio 文檔。或者,還可以保存流中的更改。但是,在這兩種情況下,都不能修改由?Src?屬性加載的原始文檔。

    將 Visio 文檔保存到文件

    該控件加載由?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 文檔保存到流

    開發人員可能要將更改保存到 Visio 繪圖控件的繪圖中,而無需將繪圖保存到磁盤中。例如,如果用戶修改 Word 文檔中嵌入控件中的 Visio 文檔,那么當用戶將該 Word 文檔以電子郵件消息形式轉發時,所做的更改會丟失。當另一個用戶打開該文檔時,該控件會加載由?Src?屬性指定的文件,覆蓋所有修改。

    要將流中的更改保存到控件中的 Visio 文檔:

  • 使用 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 控件的用戶設置

    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 菜單合并主機的菜單和工具欄集成

    如果您的容器不支持 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 VariantDim strMessage As String' Determine if mouse up event fired.If nEventCode = visEvtCodeMouseUp ThenMsgBox ("MouseUp coordinates (" & pSubjectObj.X & ", " _& pSubjectObj.Y & ")")End IfEnd Function

    下面的代碼示例說明如何使用?AddAdvise?方法來創建鼠標對象的事件對象。

    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...")

    委托鼠標單擊事件

    盡管使用?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。

    轉到原英文頁面

    轉載于:https://www.cnblogs.com/Joezhang433/p/10386692.html

    總結

    以上是生活随笔為你收集整理的以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。