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();
}

 

时间: 2024-10-24 14:21:10

WinForm打印之页边距的相关文章

WPS双面打印设置页边距的技巧

  前面介绍过了WPS文字打印的所有功能,其中对双面打印功能也做了基本的了解.在实际中,我们打印文档时,会考虑装订因素,所以在双面打印前要对文档的边距进行相关的设置.下面就是设置左右页边距对称的步骤. 1. 在"文件"菜单中,单击"页面设置"命令. 打印 2. 单击"纸张边距"选项卡,在"页面边距"框中键入上.下.左.右边距的值;在"页面选择"页面中,选中"左右页边距对称"复选框,这时&

Word2007文档中怎么对称页边距双面打印

1.在word2007中我们先打开要处理的word文件,然后点击"Office按钮"-"打印"-"打印预览" 如下图所示: 文档中怎么对称页边距双面打印-对称页边距">2.进入页面的"打印预览" 中我们找到"页边距" 菜单列表中的"自定义边距" 如下图所示: 3.在弹出的"页面设置"窗口中将"页码范围"设置成"对称页边距&

为什么Excel打印预览中的四条边的页边距各有两条线

左右应该是各一条线,上下才是各两条线. 上是一条页边距,一条页眉线 下是一条页边距,一条页脚线 在EXCEL里面打印预览时,发现有一张白纸上面有两条线,下面有两条线,左包括内容有三条线. 打印预览--页边距--然后你点下边的虚线.--出现一个下拉箭头你就可以设置啦. EXCEL里出现一条虚线(不是分页线),打印预览时线后边的表格全没有了,鼠标也拖动不了 应该就是分页线吧,在打印预览里可以编辑的,往后拖就是了,我以前也遇到过,拉动之后当然是缩放的效果,因为A4纸的大小固定,你要装入更多的东西,只能

winform打印预览上下页

问题描述 winform打印预览上下页的按钮怎么放大,或者重新做一个按钮的事件怎么写' 解决方案 解决方案二:主要是上下页按钮太小了,触屏不好操作解决方案三:这个界面看上去也是自己写的,还不会改吗,看一下数字控件的事件怎么写的,然后改成用"上一页","下一页"按钮.解决方案四:就是不会看数字控件的事件啊解决方案五:改成按钮上一页和下一页就行了啊,没必要用数组控件啊解决方案六:4L那事件怎么写啊

asp.net中WinForm分多页打印示例

示例  代码如下 复制代码 using System; using System.Drawing; using System.Drawing.Printing; using System.Windows.Forms; namespace WindowsFormsApplication1 {     public partial class Form1 : Form     {         private PrintDocument printDocument1; //PrintDocumen

Word入门动画教程29:对称页边距

对于需要双面打印的文档,我们可以将其设置为"对称页边距",使纸张正反两面的内.外侧均具有同等大小,这样装订后会显得更整齐美观些.设置步骤如下: 1.打开"页面设置"对话框,切换到"页边距"选项卡. 2.在"多页"下拉框中选择"对称页边距",这时页边距的"左"变为"内侧","右"变为"外侧",可以看到下面预览中原来的单页变为左右对

excel表格怎么设置a4纸打印成整页?

  excel表格怎么设置a4纸打印成整页?          1.页面布局--纸张大小--A4进行设置 2.页面布局,点击页面设置 3.左右上下页边距均改为0,水平垂直居中--确定 4.文件打印设置--将工作表调整为一页 5.在预览窗口查看修改该后的效果

Word 2003文档的页边距怎么调整

  Word 2003文档的页边距怎么调整          拖拽右下角的比例滑块调整显示比例,建议设置为25%,用鼠标选定.如果是Word 2003,进入打印预览界面之后,点击缩放比例数字左侧的田字格按钮进入多页模式,单击放大镜按钮使其处于可编辑的状态,用鼠标任意选定横版页面上的任意字符,再按住Ctrl键继续选定其他横版页面上的其他字符,接下来依次选定"文件/页面设置",打开"页面设置/页边距"对话框,在这里根据需要设置页边距,关键的是设置应用于"所选节

Word页面页边距怎么设置

  Word页面页边距怎么设置          1.在"页面布局"选项卡中单击"页面设置"组中的"页边距"按钮,在展开的下拉列表中选择需要使用的页边距设置项,如图1所示. 图1 使用预设页边距 2.在"页边距"列表中单击"自定义边距"选项打开"页面设计"对话框的"页边距"选项卡,对参数进行设置能够更为自由地实现页边距的设置.如,当文档需要装订时,为了不遮盖文字,需要