如何使用C#进行Visiovisio的二次开发发

C#进行Visio二次开发之图纸打印_武林网
→ C#进行Visio二次开发之图纸打印
C#进行Visio二次开发之图纸打印
Visio的二次开发中,我们往往需要打印文档,这也是正常不过的需求,Visio的Document对象提供了下面几种打印模式: Constant Value Description visPrintAll 0 Prints all foreground pages. visPrintCurrentPage 2 Prints the active page. visPrintCurrentView 4 Prints the current view area. visPrintFromTo 1 Prints pages between the FromPage value and the ToPage value. visPrintSelection 3 Prints a selection 上面几种是什么意思呢?下面详细解说下,visPrintAll是将当前的文档进行分页打印,如果是你的控件中有多个页面的话,使用方法如下: visPage.Document.PrintOut(VisPrintOutRange.visPrintAll, 1, 1, false, "", false, visPage.Name, 1, false, false); visPrintCurrentView是将你看到的窗体视图内容打印出来(一般很少用,因为可能截取到一半的区域而已),用法如下: visPage.Document.PrintOut(VisPrintOutRange.visPrintCurrentView, 1, 1, false, "", false, visPage.Name, 1, false, false); visPrintSelection就是打印选取的内容,这个有用,当你选中一部分东西,想将其打印出来的时候。不过注意的是,你要确保你选中了内容,否则会打印出来是整个控件页面的内容,其用法如下: visPage.Document.PrintOut(VisPrintOutRange.visPrintSelection, 1, 1, false, "", false, visPage.Name, 1, false, false); 其他的用法大同小异,可以自己下去试试。 另外还有一种打印方式,是打印一个大页面中的一部分,这个就需要技巧了,首先你需要获取到页面的Picture对象,转换为Image对象(下面介绍如何转换),然后打印整个Image对象中的一部分,通过定位左上角位置,和输出矩形大小就可以了。 Rectangle srcRect = new Rectangle(dblLeft, dblTop, this.visioImage.Width /2, this.visioImage.Height/2); e.Graphics.DrawImage(this.visioImage, destRetangle, srcRect, GraphicsUnit.Pixel); Visio的Picture属性及转换 Visio文档打印的时候,有时候需要预览下内容,那如何实现呢,其实也很简单,因为你打印的Page对象有一个Picture的属性,可以用来显示的(Window.Selection也有一个这么对象,当然就可以用来预览选择的内容了)。不过到这里别高兴太早,因为Picture对象是IPictureDisp类型的,你需要转换为PicutureBox对象所能识别的Image类型,不过这个东西不是那么容易转换的,呵呵。 费了九牛二虎之力,终于查到了转换的方法,下面介绍下吧,以免大家走弯路。 先建立一个AxHostConverter的转换类,继承自 AxHost,如下: public class AxHostConverter : AxHost { private AxHostConverter() : base("") { } static public Image ictureDispToImage(stdole.IPictureDisp pictureDisp) { return GetPictureFromIPicture(pictureDisp); } } 在赋值给PictureBox的Image对象的时候,如此这般就OK了 pictureBox1.Image = AxHostConverter.PictureDispToImage(this.visPage.Picture); 打印页边距设置问题 再说另外一个问题,不知道大家有没有注意到,页面设置对话框中,页边距中的值默认是10,你确定之后,值就变小了,再打开确定,值变得更小了,这是因为页边距值的转换出了问题,要正常工作,需要做一些转换的工作。下面贴出代码,一目了然。 PageSetupDialog dlg = new PageSetupDialog(); dlg.Document = PrintD dlg.PageSettings.Margins = PrinterUnitConvert.Convert(dlg.PageSettings.Margins, PrinterUnit.ThousandthsOfAnInch, PrinterUnit.HundredthsOfAMillimeter); if (dlg.ShowDialog() == DialogResult.OK) { } else { dlg.PageSettings.Margins = PrinterUnitConvert.Convert(dlg.PageSettings.Margins, PrinterUnit.HundredthsOfAMillimeter, PrinterUnit.ThousandthsOfAnInch); } 最后给一个图,显示下所完成的工作:
本文引用网址:
在下列搜索引擎中搜索“C#进行Visio二次开发之图纸打印”的相关信息:
你可能还喜欢以下文章
?上一篇书院:
?下一篇书院:& & & & & &由于863子课题的需要,需要进行Visio二次开发,最开始如何进行环境配置呢?我采用的是VS2010和office2010,软件配置要求如下:
1、编程选择环境VS2010或者VS2013均可。
2、计算机上需要安装Office和Visio;Office要求必须要32位,Visio也要求为32位的。
3、Office和Visio均需要2010版,2013版可以运行,但是会造成一部分图元组件显示不了,所以Office和Visio都请安装成2010版。
4、计算机上需要安装Visio2010 SDK,可以在微软官网下载到匹配的Visio 2010 SDK 32位。
5、项目中VisioTest需要引用上面4个项目DAL、JMetalCSharp、JMetalRunners和Model,如下图:
6、项目中VisioTest需要引用3个COM组件:MicrosoftExcel 14.0 Object Library、Microsoft Office 14.0 Object Library和Microsoft Visio 14.0 Type Library,如下图:
7、工具箱中添加项,选择COM组件,找到axDrawingControl控件并加载,如下图:
8、若开始的时候axDrawingControl控件无法显示,需要Main窗口的设计代码中涉及axDrawingControl的代码先删除,再重新拖入axDrawingControl放在Main窗体的下方panel3上,并将axDrawingControl的Dock属性设置为fill填充panel3,如下图:
9、若有时候,axDrawingControl控件无法拖入,则先删除两个VisOcx的引用,然后清理解决方案,重新生成解决方案即可。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:181次
排名:千里之外 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
【精品】如何使用C#进行Visio二次开发-总结版
下载积分:720
内容提示:【精品】如何使用C#进行Visio二次开发-总结版
文档格式:PDF|
浏览次数:21|
上传日期: 06:30:01|
文档星级:
该用户还上传了这些文档
【精品】如何使用C#进行Visio二次开发-总结版
官方公共微信C#中Visio二次开发:打开visio文档并获取图形对象
我这个人比较直接,用C#控制就想看看效果。比如实现一个动画?哭脸变笑脸? 当然我脑海中这很简单,无非就是做一个visio图,把哭脸和笑脸摆在一起,重叠放置,然后一会儿把哭脸放在前边,一会儿把笑脸放在前边。&
这个很简单吧?至少听起来很简单。这里有两件事情需要搞清楚。第一,我们知道visio里的东西都是Shape,就是形状了,似乎印象中Shape是一个对象,Shape. BringToFront();就是放置在前边。这个解决Shape放置很容易了。第二,既然Shape是一个对象,那我们怎么知道哭脸是哪个对象,笑脸是哪个对象呢?这就存在一个Visio中的查找形状的问题。说实话这个问题真是讨厌,按照我的想法,因为Visio中每一个Shape都可以定义自己的形状数据(就是形状上按右键&数据&形状数据定义的东西),我只需要为哭脸定义一个形状数据,为笑脸定义一个形状数据,然后查找包含指定形状数据的形状,这样就可以确定了。
简单说来就是这样的:
foreach(每一个形状)
如果形状.形状数据 = 指定的形状数据(例如哭脸或笑脸)
形状.BringToFront()
怎么打开visio文件?&
恩,说了这么多,第一件事就是打开visio文件。C#操作visio需要Reference中引用Microsoft..Interop.V 然后在CS文件中:
using Microsoft.Office.Interop.V&
第一件事情就是初始化一个app:
ApplicationClass app = new ApplicationClass();
第二件事情就是打开文档:
doc = app.Documents.OpenEx("E://csharp//tstvisio001//test.vsd", (short)Microsoft.Office.Interop.Visio.VisOpenSaveArgs.visOpenCopy);&
Okay,我们初始化了app,也打开了这个test.vsd,然后呢?我把整个visio进行全屏:
app.DoCmd((short)VisUICmds.visCmdFullScreenMode);
为了让visio关闭的时候别提示要保存,咱们让visio以为已经保存了:
doc.Saved =&
好了,事已至此,差不多算打开了visio文件。&
关闭文件请:
doc.Close();
app.Quit();&
怎么枚举页面中每一个形状?&
简单说来,枚举页面中每一个形状可以使用Document.Pages[x].Shapes来枚举。页面上的所有形状都是Shape,放在该Page对象的Shapes里边。
for(i=1;i&=doc.Pages[1].Shapes.Ci++)
Shape sp = doc.Pages[1].Shapes[i];
注意Shape的下标是从1开始的。&
怎么寻找定义的形状数据。&
这个比较搞,花了一点时间才弄明白。首先是要搞明白Visio的结构。显然形状数据从属于形状。也就是说我期望Shape里有一个专门的形状数据属性,然后直接取出来就可以。后来发现Shape的属性中没有这个东西,找来找去都是什么GetRowCount,GetCellsSRC之类的东西。
貌似保存的形状数据也是在Row、Cell里。注意了,神秘的Row、Cell是Visio的基础。Row是一个框,什么都往里装。我看例子和帮助里都是用CellsSRC之类的东西取的Prop。CellsSRC的参数有三个:short Section, short Row, short Column
Section:帮助里语焉不详的说什么visSectionProp是形状数据。
Row: 许多里直接写的就是0
Column: 许多里也直接写的0
实际上我们在笑脸中定义了形状数据后,直接用Shape. get_CellsSRC((short)VisSectionIndices.visSectionProp,(short)0,(short)0); 可以直接取得刚才定义的形状数据Cell。&
看到这里我迷惑了。一开始看到参数中又是行又是列,脑海中赫然一张二维表,恩恩,有道理,可能形状数据可以定义很多吧,但后来一看,md难道每次定义的都是在第0行第0列?这不是sb了么?
恩恩,这个问题直到后来研究改颜色的时候才明白过味来。我一开始写的程序,就直接用的Shape. get_CellsSRC((short)VisSectionIndices.visSectionProp, (short)0, (short)0); 。这里可以给大家一个小提示,VisRowIndices.visRowProp 的定义就是0,VisCellIndices.visUserValue的定义也是0 ,也就是说,get_CellsSRC((short)VisSectionIndices.visSectionProp, VisRowIndices.visRowProp, VisCellIndices.visUserValue); 和0,0是等价的。
废话不多说,直接上程序:&
public Shape findshapebyid(string sid)
short iCellE
for (i = 1; i &= m_Doc.Pages[1].Shapes.C i++)
sp = m_Doc.Pages[1].Shapes[i];
iCellExits = sp.get_CellsSRCExists((short)VisSectionIndices.visSectionProp, (short)VisRowIndices.visRowProp,
(short)VisCellIndices.visUserValue,(short)1);
if (iCellExits == 0)
ce = sp.get_CellsSRC((short)VisSectionIndices.visSectionProp, (short)VisRowIndices.visRowProp,
(short)VisCellIndices.visUserValue);
if (ce.Formula == sid)
这个要注意一下,因为我们用的Cells.Formula,因此如果定义的是CUSTID1,那么对应的Formula的值就是带了前后引号的&CUSTID1&,因此,传入参数应当是&/&CUSTID1/&&。
程序及文件&
做了一个Visio文件,里边两个Shape ,重叠在一起,分别定义形状数据CUSTID1,CUSTID2,然后不断拿到前边,这样形成哭脸变笑脸的动画。&
程序包: http://download.csdn.net/source/2251471
关键词:& & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事/刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
你还可能关注…
本周热门内容&&&&C#2010对visio进行二次开发初始程序
C#2010对visio进行二次开发初始程序
自己参考一些资料编写的C#2010对visio二次开发,其中包含一个txt文档说明,另外代码注释比较全面,主要介绍如何进行visio二次开发的初始操作。我做的事例是基于故障树的,在visio——商务——故障树流程图里有,就引用到了winform里。
程序比较简陋,没有菜单之类的,只是简单的把drawing control控件添加进来了。
visio2007版本,visual studio2010版本。
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行

我要回帖

更多关于 visio二次开发教程 的文章

 

随机推荐