幾種打印模式
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);
isio的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);
}
最後給一個圖,顯示下所完成的工作: