C#进行Visio二次开发之图纸打印

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

几种打印模式

Visio的二次开发中,我们往往需要打印文档,这也是正常不过的需求,VisioDocument对象提供了下面几种打印模式:

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是将当前的文档进行分页打印,如果是你的控件中有多个页面的话,使用方法如下:

None.gifvisPage.Document.PrintOut(VisPrintOutRange.visPrintAll,  11false""false, visPage.Name,  1falsefalse);

visPrintCurrentView是将你看到的窗体视图内容打印出来(一般很少用,因为可能截取到一半的区域而已),用法如下:

None.gifvisPage.Document.PrintOut(VisPrintOutRange.visPrintCurrentView,  11false""false, visPage.Name,  1falsefalse);

visPrintSelection就是打印选取的内容,这个有用,当你选中一部分东西,想将其打印出来的时候。不过注意的是,你要确保你选中了内容,否则会打印出来是整个控件页面的内容,其用法如下:

None.gifvisPage.Document.PrintOut(VisPrintOutRange.visPrintSelection,  11false""false, visPage.Name,  1falsefalse);

其他的用法大同小异,可以自己下去试试。

另外还有一种打印方式,是打印一个大页面中的一部分,这个就需要技巧了,首先你需要获取到页面的Picture对象,转换为Image对象(下面介绍如何转换),然后打印整个Image对象中的一部分,通过定位左上角位置,和输出矩形大小就可以了。

None.gif                Rectangle srcRect =  new Rectangle(dblLeft, dblTop,  this.visioImage.Width / 2this.visioImage.Height/ 2);
None.gif                e.Graphics.DrawImage( this.visioImage, destRetangle, srcRect, GraphicsUnit.Pixel);
None.gif

VisioPicture属性及转换

Visio文档打印的时候,有时候需要预览下内容,那如何实现呢,其实也很简单,因为你打印的Page对象有一个Picture的属性,可以用来显示的(Window.Selection也有一个这么对象,当然就可以用来预览选择的内容了)。不过到这里别高兴太早,因为Picture对象是IPictureDisp类型的,你需要转换为PicutureBox对象所能识别的Image类型,不过这个东西不是那么容易转换的,呵呵。

费了九牛二虎之力,终于查到了转换的方法,下面介绍下吧,以免大家走弯路。

先建立一个AxHostConverter的转换类,继承自 AxHost如下:

None.gif     public  class AxHostConverter : AxHost
None.gif
ExpandedBlockStart.gif     {
InBlock.gif
ExpandedSubBlockStart.gif        private AxHostConverter() : base(""{ }
InBlock.gif
InBlock.gif        static public Image ictureDispToImage(stdole.IPictureDisp pictureDisp)
InBlock.gif
ExpandedSubBlockStart.gif        {
InBlock.gif
InBlock.gif            return GetPictureFromIPicture(pictureDisp);
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedBlockEnd.gif    }

None.gif

                在赋值给PictureBoxImage对象的时候,如此这般就OK

None.gif            pictureBox1.Image = AxHostConverter.PictureDispToImage( this.visPage.Picture);

打印页边距设置问题

再说另外一个问题,不知道大家有没有注意到,页面设置对话框中,页边距中的值默认是10,你确定之后,值就变小了,再打开确定,值变得更小了,这是因为页边距值的转换出了问题,要正常工作,需要做一些转换的工作。下面贴出代码,一目了然。

r_PrintSetting.jpg

None.gif            PageSetupDialog dlg =  new PageSetupDialog();
None.gif
None.gif            dlg.Document = PrintDocument;
None.gif
None.gif            dlg.PageSettings.Margins = PrinterUnitConvert.Convert(dlg.PageSettings.Margins,
None.gif
None.gif                  PrinterUnit.ThousandthsOfAnInch, PrinterUnit.HundredthsOfAMillimeter);
None.gif
None.gif 
None.gif
None.gif             if (dlg.ShowDialog() == DialogResult.OK)
None.gif
ExpandedBlockStart.gif             {
InBlock.gif
ExpandedBlockEnd.gif            }

None.gif
None.gif             else
None.gif
ExpandedBlockStart.gif             {
InBlock.gif
InBlock.gif                dlg.PageSettings.Margins = PrinterUnitConvert.Convert(dlg.PageSettings.Margins,
InBlock.gif
InBlock.gif                  PrinterUnit.HundredthsOfAMillimeter, PrinterUnit.ThousandthsOfAnInch);
InBlock.gif
ExpandedBlockEnd.gif            }

None.gif

最后给一个图,显示下所完成的工作:
r_PrintVisio.jpg

本文转自博客园伍华聪的博客,原文链接:C#进行Visio二次开发之图纸打印,如需转载请自行联系原博主。



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
C#
CAD2015 C#二次开发 字体变形
CAD2015 C#二次开发 字体变形
|
NoSQL C#
基于C#的ArcEngine二次开发57:每用户订阅上的所有人SID 不存在
基于C#的ArcEngine二次开发57:每用户订阅上的所有人SID 不存在
基于C#的ArcEngine二次开发56:双击属性表跳转目标要素并闪烁
基于C#的ArcEngine二次开发56:双击属性表跳转目标要素并闪烁
基于C#的ArcEngine二次开发56:双击属性表跳转目标要素并闪烁
基于C#的ArcEngine二次开发54:IStatusBar状态栏接口的使用
基于C#的ArcEngine二次开发54:IStatusBar状态栏接口的使用
基于C#的ArcEngine二次开发54:IStatusBar状态栏接口的使用
|
定位技术 C# 图形学
基于C#的ArcEngine二次开发53: mxd与IPagelayout
基于C#的ArcEngine二次开发53: mxd与IPagelayout
|
NoSQL 数据处理 C#
基于C#的ArcEngine二次开发52:GDB数据处理过程中与Name相关的操作
基于C#的ArcEngine二次开发52:GDB数据处理过程中与Name相关的操作
基于C#的ArcEngine二次开发52:GDB数据处理过程中与Name相关的操作
基于C#的ArcEngine二次开发51:获取图层字段唯一值列表(Get Unique Values)
基于C#的ArcEngine二次开发51:获取图层字段唯一值列表(Get Unique Values)
基于C#的ArcEngine二次开发51:获取图层字段唯一值列表(Get Unique Values)
|
算法 C#
基于C#的ArcEngine二次开发50:生成面空洞连接线
基于C#的ArcEngine二次开发50:生成面空洞连接线
基于C#的ArcEngine二次开发50:生成面空洞连接线
|
存储 NoSQL Unix
基于C#的ArcEngine二次开发50:MDB创建新要素类及“无当前记录”异常处理
基于C#的ArcEngine二次开发50:MDB创建新要素类及“无当前记录”异常处理
基于C#的ArcEngine二次开发50:MDB创建新要素类及“无当前记录”异常处理
|
NoSQL C# 数据库管理
基于C#的ArcEngine二次开发49:修改图层名称和别名、字段名称
基于C#的ArcEngine二次开发49:修改图层名称和别名、字段名称