打印時的定位控制。 記得以前 有時候公司讓我用photo shop 制作一些logo 什么的 然后用a4紙打印出來 ,或者打印到A4的不干膠上 我的做法是 在photo shop里新建文檔 ,尺寸為a4 ,然后把標尺顯示出來 ,然后托輔助線 比着做 。 總之最后把圖 A4滿副打印 就會是那么大。
C#里的打印很簡單的,但是一直有個困擾我的 那就是在紙張上的定位。 onprintpage 事件里得到的反正是graph對象 他drawstring drawline 的時候你也不知道 以什么標准 ,雖然 在參數里可以得到單位。並且這個玩意還跟分辨率有關 。分辨率高 感覺出來的小。
那么我現在需要一種方式 在紙張上根據毫米為單位 來進行畫圖,並且還要像photo shop 那樣 在軟件界面上顯示出標尺 標示出 一厘米處是多少 ,一毫米處是多少 到時候打印在紙上他就一定是那么長。 怎么做呢 看我的。
我們就用系統自帶的這個虛擬打印機來做測試。 好我們先創建一個自定義尺寸,10cmx10cm 的正方形打印區域 打開控制面板 設備和打印機 -》 打印服務器屬性。如果是xp的系統大同小異 然后在打印首選項里把 紙張類似設成我們剛剛定義的尺寸。
都知道獲取打印區域 可以.PageBounds 但是我一般喜歡用這個 e.PageSettings.PrintableArea。就用上面的打印機設定 我們來看看 他們之間有什么不一樣 沒太大區別。
都輸出394, 只不過一個小數點后位數保留多些。
首先我們來畫一個線段:
1 e.Graphics.DrawLine(Pens.Red, new Point(0, 0), new Point(100, 100));
關於graph 有很多種unit 也就是多種長度單位。 看看我們這里的
1 GraphicsUnit unit = e.Graphics.PageUnit;
結果是display
講到這里 總算明白了一件事情撒 那就是 不管怎么說 394個display == 10cm。上面那句代碼e.Graphics.DrawLine(Pens.Red, new Point(0, 0), new Point(100, 100)); 他說畫一百個單位 你也不知道畫了多少。
用下面這個方式 ,先把單位換了。
1 e.Graphics.PageUnit = GraphicsUnit.Millimeter; 2 e.Graphics.DrawLine(new Pen(Color.Blue, 0.5f), new Point(0, 0), new Point((int)Math.Sqrt(10000f) - 2, (int)Math.Sqrt(10000f) - 2));
看是不是達到我們要的效果了, 但是 看 是不是線寬又變粗了,因為同樣量是一樣 單位卻不一樣了。 自己酌情調整 ,像這樣
1 e.Graphics.DrawLine(new Pen(Color.Red, 0.5f), new Point(0, 0), new Point((int)Math.Sqrt(10000f) - 2, (int)Math.Sqrt(10000f) - 2));
可能你想先換下單位Millimeter 然后Display, 然后就可以知道他們之間的比率了。 但是這樣並不方便 e.Graphics.pageunit 始終用於控制繪制時的單位。 其實就目前的知識其實想做的你都能做到
關鍵部分來了 關鍵部分來了筒子們。
現在我們是已經知道紙張是10cmx10cm ,如果在你不知道的情況下呢 。 先看看下面這段把毫米參數轉換為 像素point的代碼:
1 //papersize 以百分之一英寸為單位的 紙張大小, 2 float widthMM = papersize.Width * 0.254f; 3 float heiMM = papersize.Height * 0.254f; 4 5 Point p=new Point(); 6 p.X= (int)(printsize.Width/widthMM*mmX); 7 p.Y = (int)(printsize.Height / heiMM * mmY); 8 return p;
為什么要乘以0.254 為什么要乘以0.254 為什么 ,因為這個 圖:
查看關於paperSize.Width的解釋 :獲取或設置紙張寬度(以百分之一英寸為單位)。 e.PageSettings.PaperSize 即為獲取實際紙張大小。
乘以0.254即為獲取打印紙的邊有多少毫米數 ,而且e.PageSettings.PrintableArea又可獲取打印的邊的像素數 這就很清楚了噻。
試試看呢 是不是ok
1 e.Graphics.PageUnit = unit; 2 e.Graphics.DrawLine(Pens.Green, new Point(0, 0), 3 getScale(e.PageSettings.PaperSize, e.PageSettings.PrintableArea, 4 (int)( e.PageSettings.PaperSize.Width * 0.254f)-1,(int)( e.PageSettings.PaperSize.Height * 0.254f)-1));
軟件界面上的顯示 跟控制 這個是很容易的噻,像素跟毫米的換算 上面也講了目前的知識就夠了 。
這是上次做過一個東西的效果 顯示刻度標尺 拖動標簽 ,然后打印到紙上映射到實際尺寸 :