c#中如何添加Visio Drawing Control 控件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#中如何添加Visio Drawing Control 控件?相关的知识,希望对你有一定的参考价值。

其实就是C#访问VISIO的自动化模型,以前做了不少C#和Excle及word 的交互工程,在用VS2010 尝试开发Visio 2007项目时,却忘了当时要安装Office 2003 开发SDK。所以开发visio工程,也要下载安装office 2007 开发sdk。英文版的。

然后就建立一个C#项目。在工具箱上点右键,选择“选择项”,在打开的对话框中选择“com控件",在其中找到visio 12.0 drawing control。然后该控制就被添加到工具箱。还需要引用类型库否?貌似是不需要。

在cs文件中using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Visio;之后,就可以引用对象:

也可以直接访问拖上form的visio 控件。

 

axDrawingControl1.Window.ShowRulers = 0;
axDrawingControl1.Window.ShowGuides =   0;
axDrawingControl1.Window.ShowPageTabs =   false;
axDrawingControl1.Window.Zoom = -1;

axDrawingControl1.Window.Application.Documents.OpenEx(stencilPath,(short)VisOpenSaveArgs.visOpenRO+(short)VisOpenSaveArgs.visOpenDocked);



注意由于office系列的本质是vb模型,所以在C#中调用要有一些变化,比如showguides等属性设置不能直接用true和false。以前在开发excle时,还有调用模型方法时VB的变参到C#调用的转换问题。下面的openEx,将以只读和dock方式打开一个自己创建的“模具”(.vss文件),这个模具将同样出现在控件窗口内,供visio文档绘图使用。


如何使用C#进行Visio二次开发-总结版

很久没有写C#进行Visio二次开发的文章了,这次温习一下Visio二次开发的相关知识,全面总结一下Visio 二次开发的方方面面。一方面让对Visio的开发不太了解人员有一个全局的认识,对已经看过我前面文章的人来一个回顾总结。

本次主要根据我在Visio二次开发过程中,获得的一些实际系统开发经验以及学习历程,分三个方面对下面内容进行介绍:

1)介绍C#的Visio二次开发管理系统的架构设计思路

2)介绍C#进行Visio开发的准备工作

3)Visio的编程对象模型

 

1)Viso二次开发管理系统的架构设计思路 

 

为了,有效的模仿Office界面,我们使用了很多相似工具条图标,图标有一个透明的颜色,可以使得图标展示更加完美,不留底图背景的痕迹。

当然,整个布局使用了很有名的WeifenLuo.WinFormsUI.DockContent, 来使得界面更加完美,另外,有一点值得提及的是,为了使得工具条可以移动,分段等操作,这里还使用了框架本身提供的ToolStripPannel面板。

 

下面对系统的各个界面区域做一个总体的说明,首先我们看看下面的图形,我分了几个部分。 

 

其中红色部分是Visio控件本身的内容,左边的形状(也称模具)窗口,是通过调用打开形状文件而呈现出来的。我们做Visio的二次开发,多数是和这个控件打交道了。其他部分,设计好界面后(主要涉及布局界面的设计使用了),只需要调用相关的API接口就可以实现相关的功能了。 

 

Viso二次开发架构设计图

整个系统的架构设计如下图所示,其中绿色部分为外部控件,其他部分为自己编写的代码,边界也划分的比较清晰,界面层只是和业务逻辑层交互,不会直接操作数据库或者Visio文件,这两个部分交给下面数据访问层(DAL) 和 Visio对象访问层(VOL)进行封装调用。数据访问层对数据库的访问,是通过微软的企业库Enterprise Library库进行调用的,这样可以保证更少的代码,更高的代码质量。其中实体层和通用层是各个模块的共用的内容。  

 

 

Visio的二次开发,除了需要操作Visio的文件(包含多个模具文件,Viso文档)还有就是也需要和数据库打交道。

为了较好区分和协调他们的访问,我设定了一个访问边界:访问数据库的层不会访问Visio文件对象,访问Visio文件对象的不会去访问数据库,它们统一由业务层(Business)调配,各层之间分享Entity层的信息即可。

数据库的底层访问通过利用Enterprise Library的模块完成,因此DAL层只需要做较少的工作即可完成对数据库的访问了。

 

Visio的二次开发图纸审批流程

 

 图纸只有通过了编辑后,同时校对、和审核才能够发布,已发布的图方可供Web 端查看。

保存图纸的时候,如果是制图员,将在图纸“制图”栏目中填写用户名,并擦除复核、校对、签发的用户名,图纸状态恢复“编辑”状态;如果是校对或者复核人员,将在“校对”或者“复核”中填写用户名,并擦除“签发”的用户名,图纸恢复“已校对”或者“发布中”的状态;如果是签发人员,系统询问“是否发布”,选择是图纸状态变为“已发布”,否则变为“发布中”,并擦除签发的用户名。

整个发布的流程,是通过属性值进行判断,没有涉及太多的流程内容,因此对图纸的发布操作也相对比较简单。

 

系统模具对象关系

整个系统设计很多类型的模具对象,所有的设备都有一个字段用来表示其属于那种设备,设备基本上分下面为几类:一类是纯粹的符号,不涉及统计等信息,如河流、道路等;一类是线路设备,包括母线、电缆、架空线;一类是开关,包括负荷开关、刀闸、继保开关等;一类是变压器,包括公用变压器、专用变压器等。

模具的设计比较讲究,由于Visio在图纸分析的时候,如果是组合的模具图标,会认为是两个模具图标,对于拓扑分析非常不利,因此所有的模具均是通过ShapeSheet中的Geometry形状进行绘制,这样就保证整个模具是一个整体,模具绘制是个非常精细复杂的工作,还需要考虑文本、开关闭合等事件的界面处理效果,这个如果需要了解和掌握,需要开几节课程才能讲的清楚。下图大致绘制出了系统中设备的层次关系图,注意仅是概念图,真实的系统中,设备直接没有继承关系。

 

 

 Visio二次开发的设备状态跟踪

对于一个使用Visio进行二次开发的程序来说,背后你需要知道用户增加了那些设备,删除了那些设备,修改了那些设备(移动或者更改了文字、属性等操作),这样你才能对整个系统的数据进行有效的控制。如果需要知道这些,那么你对设备的状态跟踪就显得非常重要,特别是一个删除设备的操作,设计到需要删除相关的内容的时候,这项工作就特别的重要了。

由于设备的状态更新频繁,为了系统的稳定及效率,整个系统是在图纸保存或者修改的时候,并不保存相关的设备信息;当图纸发布的时候,清空原来的数据库设备信息表,重新遍历图纸的设备信息,把它一次性写到数据库中,这样保证了发布图纸设备信息的权威性,同时提高了系统的性能。

 

 

 Visio对象状态跟踪的事件侦听

在C#的Viso开发例子中,都建议采用事件侦听的方式进行处理相关的内容,这是一个很好的突破(相对VB中的开发例子而已),不过处理也有一些麻烦,主要是观念的转变以及细节的考虑吧。在这里,你可以侦听到任何你关注的事件,然后通过自定义的函数,实现自己的业务处理,这种方式实现起来确实比较简洁,思路非常清晰。

 

 

Visio对象数据库对象及关系

为了保持Visio的相关设备信息,你需要在数据库中建立相关的表,来存储设备属性信息以及图纸信息,方便信息的统计查询,图纸更可以通过Web进行查看等。

其中的Device1是一个根据SystableField表自动生成出来的设备表,它的表名会自动在SysDeviceTable中注册,方便寻找对应设备类型是哪个表。SystableField是差不多是根据Visio对象里面的属性定义的一个拷贝,里面记录了字段名称、字段类型、是否可见、排序、格式、默认值等这些Visio属性定义里面有的(你打开ShapeSheet中就看到每个属性对应一行的定义信息,就是这里面的内容的存储了)。

系统里面有一个VisioImage和VisioImageRelease的表,一个是存放增加或者修改的图纸内容(二进制存储),一个是存放发布后的图纸(二进制存储),我们系统打开图纸的侯,就是写在这个表的二进制文件,还原成Visio文件,进行打开的。

 

 

 

2)C#进行Visio开发的准备工作


安装Visio2007、VisiosDK2003和2007版

     Visio2007是推荐的开发版本,因为目前基本上Visio2007应用比较多了,而且2003估计也买不到了,另外Visio的SDK,建议两个版本的都要安装,互补下相信息的不足。如VisioSDK2003中 有对象模型图,2007中没有。

 

熟悉Visio Drawing Control控件使用

       这个控件的熟悉使用时非常重要的,因此在开发之初,最好能够多用这个控件做一些简单的例子,了解里面的各种属性、函数,以及事件的处理等。这样对于开发一个复杂的系统,是非常有帮助的。

 

Visio开发帮助文档

         VisSDK.chm

         Visio Code Samples Library.chm

        这两个帮助文档基本上涵盖了Visio开发的方方面面,其中有很多代码可以用来做参考,里面对于一些概念或者对象的说明及分析,也是非常独到和有帮助的,虽然是英文的内容,看起来比较费劲,但是开发文档的英文都是比较简单的,应该多看看。

 

 Visio2007文档操作

        查看ShapeSheet属性及帮助内容

   这个是无可替代的开发熟悉内容,里面的对于各个ShapeSheet的属性描述,更是进阶高级Visio开发的必经之路。

 Visio宏的录制

     要熟练掌握Office的宏录制和查看功能,对于Visio开发来说就是熟悉和了解宏代码了,里面如何操作Visio对象,是很有参考意义的。

 

设置Visio文档的开发人员模式

 

 

 切换Visio的ShapeSheet视图

 

 

ShapeSheet视图

 

 

 

 

 3)Visio的编程对象模型

Visio二次开发中,对于其对象模型的了解,就写我们吃饭用筷子一样重要,否则不熟悉筷子的使用场景和方法,是吃不到东西的。

其中主要的是下面几个对象: 

 Application

 Window (Application.ActiveWindow)

 Document (Application.ActiveDocument)

 Master、Shape、Cell

一个程序中,就只有一个Application对象,类似进程的概念;打开的Visio文件有很多窗口,有一个ActiveWindow的主窗口,选区窗口、形状窗口等;模具文件打开后也是一个Document、打开的Visio文件也是一个Document、ActvieDocument是指当前Visio窗口对应的文档,每个Visio的Document有一个或者多个Page,如系统中有两个Page、一个为绘图Page,一个为背景Page。

模具文件里面有很多Master,Master类似于模板的概念,一个Master代表一个设备类型、Shape是定义一个图形的信息,模具里面的Master有且只有一个Shape,每个Shape又有很多Cell,代表一个ShapeSheet里面的一个格子,每个格子都有一个唯一的引用名称的。

Visio文档里面,和模具文件不同,里面一个大千世界,有很多Master,也很多Shape和Cell,但是由于我们看到图纸可能一个模具的设备会有拷贝多个,因此它们公用一个Master,也就是一个Master有多个Shape引用,我们分析文件,就知道里面有一个MasterID,有点像数据库里面的外键一样。

 

下面是VisioSDK2003中的对象模型图,概括了各个对象之间的关系。

 

 

 

关于拓扑关系

    Visio自己的拓扑关系信息很少,除了有一个Connection知道设备的两个连接关系外,信息比较少,如果需要做设备的拓扑图形分析,需要保存他们自己的关系到数据库中,指定一个开始的设备,然后对图形进行分析,如系统中的停电分析、线损分析等,都是在数据库中进行分析,实现的效果还不错,就是会比较麻烦一些。

 

 

Visio XML格式文件分析

Master格式

Pages/Shapes格式

 

Visio的XML文件之Master部分 

 

 图纸的XML文档中,Master后面的Shapes集合中只有一个Shape对象

 图纸的Shapes集合有多个对象,每个对象的NameU和Name值可能不一样,一般使用NameU

  

Visio的XML文件之Pages、Shapes 

 

  Visio中很多属性都有一个同名+U的属性名称,一般情况下最好使用这个名称如NameU,因此这个是一个唯一的名字,有时候你会发现Name相同,但他们就是不一样,因为他们的NameU名称不一样的。

 

模具文件操作

 

 

 

 

 本文是综合了所有讲过和未讲过的Visio开发知识,有些地方时前面介绍很少或者带过的,在此做了深层次的分析和介绍,对于Visio开发和探索,国内资料相对比较少,很多是探索性和尝试性的研究,希望本文能够为大家做一定的指引作用。

参考技术A 1、电脑安装visio需要的版本,最新的是2010

2、在C#界面上用工具,添加引用COM

3、找到Visio Drawing Control 12.0(visio2007版本)或Visio Drawing Control 14.0(visio2010版本),勾选上,确定就可以了

4、就会在左侧工具上看到Visio Drawing Control了,然后拖进新建的WinForm就行了。

或者在右侧,引用上单击右键,添加类型中,同样打开添加引用对话框,按照上述方法找到对应的添加了就可以用了。本回答被提问者和网友采纳
参考技术B 先添加引用类型库,后在控件栏中加入控件,即可

Emgu CV在C#中应用时,Image<TColor, short>请问TColor包含在哪个命名空间里???

Emgu CV在C#中应用时,Image<TColor, short>请问TColor包含在哪个命名空间里???

是对应System.drawing中的Color对象的话,就不需要导包吧。要导包的话就导入System.drawing追问

System.drawing已经添加了,TColor有Gray、Bgr等类型,看起来像个枚举,老说缺少命名空间

追答

可能是
你没有把OpenCV的安装下的bin目录添加到系统的环境变量path中。只要将C:\Program Files\OpenCV\bin添加到系统的path环境变量中。然後,关闭 VS2008,重新打开工程,再次编译就没有这个错误了。
配置好环境后添加命名空间Engu.CV;
Engu.CV.structure;
Emgu.Util;
如果没有问题了请采纳。

参考技术A 在Emgu.CV.Structure里追问

添加了这个还是没用,你能再帮忙试试么?确实有效的话我可以重新开个问题给你分的。

以上是关于c#中如何添加Visio Drawing Control 控件?的主要内容,如果未能解决你的问题,请参考以下文章

每次打开visio2013,visio都是正在配置,解决办法

在 C# 中,如何使用十六进制值创建 System.Drawing.Color 对象? [复制]

怎么用visio画电路示意图?如何使用visio绘制电路图啊??

如何在xamarin中添加System.Drawing?

C# System.Drawing.Graphics 画图后,如何保存一个低质量的图片,一个占用空间较小的图片

如何在visio里输入公式??