假設我在Visio中打開了一個文檔,並且在我的Visio加載項代碼中有一個指向此文檔的指針。是否有可能從模板以下信息:是否有可能從Visio中的模具中獲取圖形?
- 形狀的名稱(我的意思是類型,而不是唯一的名稱)
- 圖片
據我所知,圖表和模板是當前文件的一部分。那麼如何從文檔指針移動到可用的模板表單呢?
(通過模板我的意思是在左側,其中用戶可以看到所有可用形狀面板)
在此先感謝。 丹
假設我在Visio中打開了一個文檔,並且在我的Visio加載項代碼中有一個指向此文檔的指針。是否有可能從模板以下信息:是否有可能從Visio中的模具中獲取圖形?
據我所知,圖表和模板是當前文件的一部分。那麼如何從文檔指針移動到可用的模板表單呢?
(通過模板我的意思是在左側,其中用戶可以看到所有可用形狀面板)
在此先感謝。 丹
您可以放在頁面上的形狀的定義稱爲主。將形狀和大師視爲類似於OOP中的實例化對象和類。 Visio文檔擁有Masters系列。您在左側窗格中看到的主人可能不在活動文檔的Masters集合中。左側的每個窗格都是一個不同的文檔,稱爲模板。使用模板創建新圖時,可以打開多個模具。要了解更多關於文件,模具,大師和形狀之間的關係,請參閱Chapter 3 of Developing Microsoft Visio Solutions。
要訪問其中一個打開的模具,請使用應用程序的文檔集合。然後,您可以使用Document's Masters集合獲取各個Masters。主對象有一個Name和一個Icon屬性。
在.Net中使用Icon屬性有許多挑戰。 Icon屬性是一個IPictureDisp,你需要找到一種方法將它轉換爲可以在.Net中使用的圖像類型。 VB6庫中的IPictureDispToImage方法是一種方式,但它只能在32位可執行文件中使用。
如果您從進程外調用,即從外部可執行文件而不是加載項,Icon屬性將拋出COM異常。我從來沒有真正從C#中使用它,所以我不知道是否可以在COM和.Net之間封送IPictureDisp屬性。
如果您不能使用Icon屬性,則仍可通過調用ExportIcon方法將圖標寫入文件或剪貼板來獲取圖標。
以下代碼顯示瞭如何獲取主文件的名稱以及如何將主圖標導出到文件。
using Visio = Microsoft.Office.Interop.Visio;
...
// Create a new Basic Flowchart diragram ("_U" specifies the US units version).
Visio.Document docDiagram = app.Documents.Add("BASFLO_U.VST");
// Get a reference to the Basic Flowchart Shapes Stencle which was opened by
// the template above.
Visio.Document docStencle = app.Documents["BasFlo_U.vss"];
// Get the Decision master from the Stencil.
Visio.Master master = docStencle.Masters["Decision"];
// Get the name of the Decision master
string masterName = master.Name;
// Export the Icon from the Decision Master.
// You could use GetTempFileName here.
master.ExportIcon(
@"c:\temp\icom.bmp",
(short) Visio.VisMasterProperties.visIconFormatBMP);
我得到的點:
Visio.Application app = Globals.ThisAddIn.Application;
Visio.Documents docs = app.Documents;
ArrayList masterArray_0 = new ArrayList();
ArrayList masterArray_1 = new ArrayList();
Visio.Document doc_0 = docs[1]; // HERE IS THE MAIN POINT
Visio.Document doc_1 = docs[2]; // HERE IS THE MAIN POINT
Visio.Masters masters_0 = doc_0.Masters;
Visio.Masters masters_1 = doc_1.Masters;
foreach (Visio.Master master in masters_0)
{
masterArray_0.Add(master.NameU); // THIS WILL CONTAIN DIAGRAM FIGURES
}
foreach (Visio.Master master in masters_1)
{
masterArray_1.Add(master.NameU); // THIS WILL CONTAIN STENCIL FIGURES
}
有在「文檔」陣列成員號碼的關鍵點,它們從1開始,而不是從0像它被用來對陣列。 謝謝你的幫助。這個問題應該是封閉的。
丹