打印時的定位控制。 記得之前 有時候公司讓我用photo shop 製做一些logo 什麼的 而後用a4紙打印出來 ,或者打印到A4的不乾膠上 個人作法是 在photo shop裏新建文檔 ,尺寸爲a4 ,而後把標尺顯示出來 ,而後託輔助線 比着作 。 總之最後把圖 A4滿副打印 就會是那麼大。服務器
C#裏的打印很簡單的,可是一直有個困擾個人 那就是在紙張上的定位。 onprintpage 事件裏獲得的反正是graph對象 他drawstring drawline 的時候你也不知道 以什麼標準 ,雖然 在參數裏能夠獲得單位。而且這個玩意還跟分辨率有關 。分辨率高 感受出來的小。測試
那麼我如今須要一種方式 在紙張上根據毫米爲單位 來進行畫圖,而且還要像photo shop 那樣 在軟件界面上顯示出標尺 標示出 一釐米處是多少 ,一毫米處是多少 到時候打印在紙上他就必定是那麼長。 怎麼作呢 看個人。spa
咱們就用系統自帶的這個虛擬打印機來作測試。 好咱們先建立一個自定義尺寸,10cmx10cm 的正方形打印區域 打開控制面板 設備和打印機 -》 打印服務器屬性。若是是xp的系統大同小異 而後在打印首選項裏把 紙張相似設成咱們剛剛定義的尺寸。
3d
都知道獲取打印區域 能夠.PageBounds 可是我通常喜歡用這個 e.PageSettings.PrintableArea。就用上面的打印機設定 咱們來看看 他們之間有什麼不同 沒太大區別。
code
都輸出394, 只不過一個小數點後位數保留多些。對象
首先咱們來畫一個線段:blog
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)); 他說畫一百個單位 你也不知道畫了多少。get
用下面這個方式 ,先把單位換了。
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));
軟件界面上的顯示 跟控制 這個是很容易的噻,像素跟毫米的換算 上面也講了目前的知識就夠了 。
這是上次作過一個東西的效果 顯示刻度標尺 拖動標籤 ,而後打印到紙上映射到實際尺寸 :