几种打印模式
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
=
PrintDocument;
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);
}
最后给一个图,显示下所完成的工作:
转载请注明出处:
撰写人:伍华聪 http:
//
www.iqidi.com