惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
罗磊的独立博客
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
博客园_首页
量子位
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
S
SegmentFault 最新的问题
雷峰网
雷峰网
小众软件
小众软件
博客园 - 聂微东
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog

博客园 - ant-boss

pl/sql转义字符的问题 备份/恢复SQL Server EXP/IMP 命令参数 Programming with the Microsoft Office Visio 2003 ActiveX Control 使用Visio 2003 Drawing Control开发应用(5) 使用Visio 2003 Drawing Control开发应用(4) 使用Visio 2003 Drawing Control开发应用(3) 使用Visio 2003 Drawing Control开发应用(2) Visio 2003 开发入门 软件数字签名 在ASP.NET下用Microsoft Excel进行数据分析与报表 水晶报表常见问题(转载) Access 类型转换函数 My97日期控件 My97 DatePicker Ver 3.0.1 showModalDialog 使用TransactionScope 实现事务管理 datagrid数据导出到excel文件给客户端下载的几种方法 VSS(Visual SourceSafe)使用入门 [转] 使用asp.net 2.0和SQL SERVER 2005构建多层应用
使用Visio 2003 Drawing Control开发应用(1)
ant-boss · 2007-10-25 · via 博客园 - ant-boss

不熟悉Visio的人应该先看看visio究竟是个什么东西,visio这个东西还是很不错的软件。
在安装完Visio之后,就可以使用这个control了,在vs.net环境中,在工具箱上添加Microsoft Visio 11.0 Drawing Control的COM 组件,然后就可以往Form中拖了。(这个时候引用中会自动多了AxVisOcx, VisOcx 和Visio的引用)

这里要使用到两个namespace
using Visio=Microsoft.Office.Interop.Visio; // 这个namespace中是所有Visio对象模型的对象
using AxVisOcx = AxMicrosoft.Office.Interop.VisOcx; // 这个namespace中有该控件的对象

对于这个control,有几个很重要的属性需要知道
Src: 这个属性用来打开或者关闭当前文档,关闭当前文档直接设置Src=""就可以了,打开时,设置Src等于打开文件的路径(绝对路径)。
NegotiateMenus和NegotiateToolbars是用来显示visio自己的菜单和工具栏的,对于WinForm程序来说是无法显示的,原因是因为Window Form程序不支持OLE菜单合并的功能。而且,这个两个属性必须设置成一致的。
HostID:是为了分辨不同visio host的一个属性,一般来说,在这里放置一个GUID,这样,你的应用对Visio一些配置就不会影响到Visio本身或者其他Visio的应用了。要做这样的配置,需要在注册表项HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\VisioHosts加上这个GUID

接着,要了解Visio的对象模型,这个看msdn中就有这个object model,还有详细的说明。这里需要至少用到的一些对象包括
  private Visio.Application visApplication = null; // 当前Visio Control的Application对象
  private Visio.Page visPage = null; // 当前Visio Control的Page对象
  private Visio.Document visDocument = null; // 当前 Visio Control的Document对象
  private Visio.Documents visDocuments = null; // 当前Visio Control的Documents对象
  private Visio.Window visWindow = null; // 当前Visio Control的Window对象
  private Visio.Shape visClickedShape = null; // 当前Visio Control点击的Shape对象
这些对象需要设置,如果打开的文档发生了变化,需要更新,最好有这样的函数
  private void SetVisioVariables()
  {
   visApplication = (Visio.Application)visDrawing.Window.Application;
   visPage = (Visio.Page)visDrawing.Document.Pages[1];
   visWindow = (Visio.Window)visDrawing.Window;
   visDocument = (Visio.Document)visDrawing.Document;
   visDocuments = (Visio.Documents)visDrawing.Window.Application.Documents;
  }
这里设置visPage直接等于isDrawing.Document.Pages[1]是因为我这里使用的单页模式,所以直接设置。(注意:Visio里面的collection的内容是从1开始的,不是0)
还有一些属性可以控制,比如:
visWindow.ShowPageTabs = false; // 不让显示页的标签
visWindow.Zoom = 1.00; // 设置缩放比例为100%
visDocument.GestureFormatSheet.get_CellsSRC((short)Visio.VisSectionIndices.visSectionCharacter, 0,
 (short)Visio.VisCellIndices.visCharacterSize).FormulaU = "9 pt"; // 设置字体为9号字,这个是高级用法了,我会在后面讲解
还能控制是否显示网格,标尺等等

接下来,就可以使用了
打开文件:比如visDrawing.Src = "c:\\Blank.vtx"; 这样就可以打开一个文件,这里是一个xml的模板文件。如果是模板,那么一般来说是带stencil的,stencil就是形状模具,visio 2003带有形状搜索的功能,如果你不想让搜索出现,
    Visio.Windows wnds = visApplication.Windows;
    for(short i = 1; i <= wnds.Count; i++)
     wnds[i].Windows.get_ItemFromID((int)Visio.VisWinTypes.visWinIDShapeSearch).Visible = false;
打开后,记着设置对象:  this.SetVisioVariables();

如果想更改打开的文件,可以设置Src="";然后设置Src等于要打开的文件。但是,有时你想添一个模具窗口进来,这时候可以使用Open或OpenEx方法:
this.visDocuments.OpenEx("c:\\MainStencil.vsx", (short)Visio.VisOpenSaveArgs.visOpenDocked + (short)Visio.VisOpenSaveArgs.visOpenRO);
这样就加了一个模具窗口进来,同时设置了让这个窗口dock而且是只读打开。

保存时,使用Save或SaveAs就可以(Save只能存成vsd文件,要保存其他格式需要使用SaveAs方法)
visDocument.SaveAs("e:\\temp.vdx");

下一节,介绍对于各种事件的处理。