打印時的定位操做掃盲

打印時的定位控制。 記得之前 有時候公司讓我用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));

軟件界面上的顯示 跟控制 這個是很容易的噻,像素跟毫米的換算 上面也講了目前的知識就夠了 。
這是上次作過一個東西的效果  顯示刻度標尺 拖動標籤 ,而後打印到紙上映射到實際尺寸 :

相關文章
相關標籤/搜索