打印时的定位控制。 记得之前 有时候公司让我用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));
软件界面上的显示 跟控制 这个是很容易的噻,像素跟毫米的换算 上面也讲了目前的知识就够了 。
这是上次作过一个东西的效果 显示刻度标尺 拖动标签 ,而后打印到纸上映射到实际尺寸 :