zoukankan      html  css  js  c++  java
  • 打印时的定位操作扫盲

    打印时的定位控制。 记得以前 有时候公司让我用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));

    软件界面上的显示 跟控制 这个是很容易的噻,像素跟毫米的换算 上面也讲了目前的知识就够了 。
    这是上次做过一个东西的效果  显示刻度标尺 拖动标签 ,然后打印到纸上映射到实际尺寸 :

  • 相关阅读:
    oralce的function处理考勤时间节点以及计算工作时间
    如何把虚拟机上的文本或是文件复制粘贴到本地?
    Sqlserver语句对表结构的操作
    ubuntu下提示/boot空间不足,解决办法
    原码、反码和补码
    C++中四种类型转换方式
    C语言之 短路原则
    ubuntu下为opera26.0安装flash
    C++函数重载
    C++内联函数
  • 原文地址:https://www.cnblogs.com/assassinx/p/3922531.html
Copyright © 2011-2022 走看看