打印时的定位操作扫盲

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

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

打印时的定位操作扫盲

时间: 2024-10-09 04:10:02

打印时的定位操作扫盲的相关文章

报表打印时提示页边距被设置到纸张可打印范围之外怎么办

如图:对报表进行打印时提示:一个或多个页边距被设置到可以打印的范围之外...无法完成打印操作. 原因:由于纸张大小限制引起,这是软件的预警提示,纸张不能完整打印出显示的内容,实际打印页会有缺失.解决方法:打开报表设计器,空白处点击右键[属性],打开报表属性设置: 找到打印的相关属性设置,注意到[显示页边框警告]当前为"YES",,那么点击下拉菜单选择"NO". 保存报表设计即可. 原文地址:http://bbs.delit.cn/thread-836-1-1.htm

C# 对Excel文档打印时的页面设置

1.对打印页面的朝向,页宽,页高进行设置 参考源码[1] using Excel = Microsoft.Office.Interop.Excel; Excel.Application tmpExcel = new Excel.ApplicationClass(); Excel.Workbook tmpbook = tmpExcel.Workbooks.Open(tmppath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Ty

java学习--基础知识进阶第十天--标准输入流 & 转换流 & 打印流、对象操作流 、Properties集合

今日内容介绍 u  标准输入流 & 转换流 & 打印流 u  对象操作流 u  Properties集合 第1章 标准输入流 & 转换流 & 打印流 1.1 标准输入输出流 public static final InputStream in:标准输入流 public static final PrintStream out:标准输出流 package com.itheima_05; /* * 标准输入输出流: public static final InputStream

移动端测试——APP元素定位操作 (3)

一.appium基础API讲解 1.1 APP元素定位操作 建议: 使用显示等待 能用id.class定位就不用xpath定位 只要看的见的,用xpath的text就是万能的 手工测试主要通过可见按钮操作,而自动化是通过元素进行交互操作 元素的基本定位基于当前屏幕范围内展示的可见元素 前置代码 # 导入driver对象 from appium import webdriver import time # server 启动参数 desired_caps = {} # 设备信息(系统.版本.设备号

电子口岸 打开“退税联打印”时,PDF界面无法显示

电子口岸 打开“退税联打印”时,PDF界面无法显示 咨询0571-95198 : IE要在8-10间,系统 要Win7 32B ---------------------参考-------------- 电子口岸打印退税联弹出来内容每次都是空白的,每次需要在安全自定义级别那操作下,有时候一次能成功,有时候好几次都不能成功,请问这是为什么,我是IE11 原文地址:https://www.cnblogs.com/sjdn/p/12066643.html

[OBPG]打印时闪退问题

1. 使用的是Office批量打印精灵1.2版,软件可以打开 2. Win8.1 MSDN原版操作系统,系统重装了,.NET Framework也装了 3. 使用真实打印机打印,打印时闪退,没有任何提示 4. 安装PDFFactory虚拟打印机,使用该打印机打印,打印时也闪退 远程协助时发现,其使用的是WPS,遂让其安装Microsoft Office后可以正常使用了.

[经使用有效]Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法

sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 最近几天从网上找了几个asp.net的登录案例想要研究研究代码,结果在用 Sql Server2005附加数据库文件时弹出错误信息:如下图: ,一时无解,遂求助于百度谷歌,经过各种试验,特将解决办法整理于此,希望能帮到大家,同时如果有好的意见大家多多交流啊! 方案一:切换登录方式 出现这种情况是由于用“混合验证方式”(SQL Server身份验证)登录数据库造成的,只要将登录方式改为“windows身

关闭tab时,定位到导航栏对应的激活tab

/// <summary> /// 关闭tab时,定位到导航栏对应的激活tab /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DXtrtable_SelectedPageChanged(object sender, TabPageChangedEventArgs

按模板打印word防止并发操作

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86