WinForm打印之页边距
原文:WinForm打印之页边距

1.启用页边距:

默认情况下PrintDocument是不理会页边距的(MS再次让人无语。。。),这也是为什么有人说明明设了页边距在打印预览里却没有效果的原因。
解决办法是设置PrintDocument对象的OriginAtMargins属性为True,如下:

printDocument1.OriginAtMargins = true; //启用页边距

再来看一下从元数据中提取的关于OriginAtMargins属性的定义:

//
// 摘要:
//     获取或设置一个值,该值指示与页关联的图形对象的位置是位于用户指定边距内,还是位于该页可打印区域的左上角。
//
// 返回结果:
//     如果图形起始于页面边距,则为 true;如果图形原点位于该页可打印区域的左上角,则为 false。默认为 false。
[DefaultValue(false)]
public bool OriginAtMargins { get; set; }

可以看到此属性的DefaultValue为false,所以如果不改的话,页边距设的再大也没有用。

 2.PageSetupDialog中页边距的正常显示

这个问题一度搞得我有点儿心烦——每打开一次“页面设置”对话框,哪怕你不做任何更改就点“确定”关闭它,当你再打开它时你会发现,上面显示的页边距“神奇地”变小了。。。
举个具体的例子来说,如果你没有编程预设置页边距的话,默认第一次打开“页面设置”时的页边距应该是10mm,当你点“确定”关闭它再打开后,页边距变成了3.9mm,再重复这一操作,页边距又变成了1.5mm,依此类推。

之所以会出现不正常的现象,都是因为制式转换导致的——

.NET对于页边距是绝对的“大国沙文主义”,只认美制的“英寸”不认别的制式,其默认单位是“0.01英寸”。
而我们的OS就比较入乡随俗,知道用“毫米”。所以在PageSetupDialog窗体上中显示的单位是“毫米”(取决于OS)。
由于两边制式不一样,搭不上话,.NET就会强制的把OS的制式单位给转换成它“习惯”的“英寸”。 也就是说:
在你点击“页面设置”对话框的“确定”按钮后,.NET会自动进行“毫米->英寸”的隐式转换。
本来这也没什么大不了,问题出现在:

再度打开PageSetupDialog对话框时,PageSetupDialog对象却并没有进行与上面的隐式转换对应的“英寸->毫米”逆向转换,
而仅仅是简单粗暴地将单位名改了,从“Display”(0.01英寸)改成了“TenthsOfAMillimeter”(0.1毫米),数值却动都没动一下。
也就是说不管你给PageSetupDialog什么值,它都认为是以0.1毫米为单位的数。

看下面流程就明白了:

显示10(mm)-->0.3937(in)-->39.97(0.01in)-->因为Margin尺寸只接受int型,so-->39(0.01in) -->错误转换,只改单位-->39(0.1mm)-->显示3.9(mm)

问题是清楚了,怎么解决呢?

第一个办法(不是办法的办法):更改OS度量衡设置

操作系统是根据安装时选择的地区来确定不同的默认度量衡制式。我国用的度量衡系统是“公制”(米/厘米/毫米),而MS所在的美国用的是“美制”(英尺/英寸)。在XP系统下,可以通过“控制面板”->“区域和语言选项”->“区域选项”->“标准和格式”->“自定义”->“数字”->“度量衡系统”来设置当前的度量衡制式。把度量衡系统由“公制”改成“美国”,再去试验一切OK,只不过页边距后面括号里的单位描述变成了“英寸”。OK的原因很简单,不需要转换了嘛。

第二个办法:编写代码将英寸正确的转换到毫米

我们可以利用.NET提供的PrinterUnitConvert类的Convert方法来实现这个目标,代码如下:

private void btnPageSetup_Click(object sender, EventArgs e)
{
    PageSetupDialog psd = new PageSetupDialog();
    psd.Document = printDocument1;
    Margins mg = printDocument1.DefaultPageSettings.Margins; //保存原始Margins
    psd.PageSettings.Margins = PrinterUnitConvert.Convert(mg, PrinterUnit.Display, PrinterUnit.TenthsOfAMillimeter);
    if (psd.ShowDialog() == DialogResult.Cancel)
    {
        //psd.PageSettings.Margins改变导致printDocument1.DefaultPageSettings.Margins也随之改变,
        //所以为了避免点了Cancel后,下一次打开对话框时mg被错误地赋给了已经改变了的printDocument1.DefaultPageSettings.Margins值,
        //需要将printDocument1.DefaultPageSettings.Margins还原。
        printDocument1.DefaultPageSettings.Margins = mg; 
    }
}

Convert方法的第三个参数必须为PrintUnit枚举中的TenthsOfAMillimeter(0.1毫米),只有这样才能与“错误转换”后的单位一致从而显示出正确的值。
如果上面把第三个参数换成PrinterUnit.HundredthsOfAMillimeter(0.01毫米),得到的数字要比0.1毫米的大10倍,而PageSetupDialog不管你得到的数字是多少,都会认为它是0.1毫米单位的,所以显示出的页边距就会大10倍从而出错。

第三个办法:利用.NET 2.0新增的属性

.Net 2.0中,PageSetupDialog对象新增加了一个EnableMetric属性,MSDN中的描述是:

“获取或设置一个值,该值指示以毫米为单位显示边距设置时,是否自动将边距设置转换为以百分之一英寸为单位(或相反)。
……
PageSettings 类以百分之一英寸为单位测量 PageSettings.Margins,但 PageSetupDialog 允许用户以英寸或毫米为单位设置边距,具体取决于运行该应用程序的系统的区域设置。
在 .NET Framework 2.0 版中,如果您的应用程序可能会在以毫米为单位测量文档边距的区域中使用,则应将此属性设置为 true。如果要自己执行转换(像 .NET Framework 2.0 版之前的版本所要求的那样),则应使用默认值 false。”

此法最简单,只要设置EnableMetric为True即可。代码如下:

private void btnPageSetup_Click(object sender, EventArgs e)
{
    PageSetupDialog psd = new PageSetupDialog();
    psd.Document = printDocument1;
    psd.EnableMetric = true; //就是这句
    psd.ShowDialog();
}

posted on 2017-05-31 01:27 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/6922346.html

WinForm打印之页边距相关推荐

  1. CAD打印PDF后页边距太大怎么办?CAD打印PDF设置技巧

    有些设计师小伙伴在用CAD打印PDF后,发现页边距太大了,却不知道该如何调整.其实很简单,本节课程小编就来给大家分享一下浩辰CAD软件中调整CAD打印PDF页边距的相关操作技巧吧! CAD打印PDF页 ...

  2. C# 调用Word(PrintOut) 直接打印,出现“第一节的页边距设于可打印区域之外,是否继续”...

    /// <summary>         /// 输出到打印机         /// </summary>         public void Print()      ...

  3. vb.net 设置打印纸张与页边距_装订文档时不想让文字被挡住?在Excel中你可以这样设置打印!...

    平时我们在打印文档的时候,通常会把文档左侧的页边距设置的大一点,这样在装订的时候显得美观一点.但如果我们进行双面打印时,文档左右两边的页边距刚好相反,装订时第2页的文本很容易被挡住,这样子反而更难装订 ...

  4. WebBrowser设置打印页眉页眉和页边距

    webbrowser,居然被用作套打...... 由于是套打,格式要求很严格,页眉页脚.页边距等等等等. 在网上找到下列代码,做适当修改后基本上能满足要求了,但是由于是用JS修改注册码,因此和客户端的 ...

  5. html js打印页边距,js 设立网页打印的页眉页脚和页边距

    var HKEY_Root,HKEY_Path,HKEY_Key; HKEY_Root="HKEY_CURRENT_USER"; HKEY_Path="\\Softwar ...

  6. html js 打印编辑页眉,js 设置网页打印的页眉页脚和页边距

    var HKEY_Root,HKEY_Path,HKEY_Key; HKEY_Root="HKEY_CURRENT_USER"; HKEY_Path="//Softwar ...

  7. CSS设置打印时的页边距和多余空白页问题

    设置打印时的页边距 @page {size:auto;margin:30mm 20mm; /*上下30mm页边距,左右20mm页边距*/} 设置打印时可能会出现多余空白页问题 @media print ...

  8. 在标签打印软件中如何测量并设置页边距

    我们在中琅标签打印软件中制作标签时,首先是需要先设置纸张尺寸.在设置时通常会让设置页面边距,这个地方其实是和我们word里面的页面边距是不一样的,我们都知道Word里面的页边距指的是文本内容到纸张边沿 ...

  9. CSS @page 规则 设置打印页面框的尺寸,方向和页边距,用于打印预览和从浏览器打印Web文档

    @page规则定义styleSheet中页面框的尺寸,方向和页边距,用于打印预览和从浏览器打印Web文档.通常,在此构造中,各种CSS属性(如大小,页面和边距)用于指定页面框的尺寸,方向,边距等. 页 ...

最新文章

  1. 面试常碰到++p/p--问题到底结果是什么?
  2. C++ 使用 curl 进行 http 请求(GET、POST、Download)的封装
  3. 安装python sklearn经验总结
  4. go grpc测试_Grpc — 整体性能测试
  5. LeetCode每日一题 52. N皇后 II
  6. JSP简介及入门(含Eclipse for Java EE及Tomcat的配置)
  7. vs官方使用教程中文版与英文版
  8. 八中计算机是学啥的,北京八中:居然有这么好玩的课
  9. php链接本地mysql数据库配置文件_php连接 mysql 数据库如何添加一个公共的配置文件...
  10. spring @Scheduled 注解实现的定时任务 3步走
  11. 优秀的程序员是如何诞生的?
  12. 解决 GiWiFi 普通用户无客户端无法登入
  13. Git——创建版本库【git init】
  14. Android 项目经验汇总:Fiddler的坑,证书无效
  15. 演练Ext JS 4.2自定义主题
  16. UCHOME出现问题(转帖)
  17. Grid Search 网格搜索 介绍
  18. ECharts 实现地图功能
  19. easyExcel设置单个单元格(颜色)样式
  20. CodeForces 711C.Coloring Trees【DP】

热门文章

  1. Netty实现自定义协议
  2. 一千个不用 Null 的理由,你还用?
  3. 来,带你鸟瞰 Java 中的并发框架!
  4. 在阿里干了五年,面试个小公司挂了…
  5. 你们要的动图来了:2张动图快速理解高内聚与低耦合
  6. 数据库:悲观锁与乐观锁
  7. 【Scratch】青少年蓝桥杯_每日一题_1.17_春夏秋冬四季
  8. 【Python】青少年蓝桥杯_每日一题_12.03_输出字符串的长度
  9. 【阿里云 Linux 服务器】购买 Linux 到项目部署过程中遇到的问题,部署 SpringBoot 项目到服务器上,在手机上安装 Android 程序进行测试
  10. Uncaught ReferenceError: layer is not defined