找出最大可用打印区域

时间:2010-05-29 19:26:09

标签: c# .net printing

我正在尝试查找打印机上的最大可用区域。我打印了一个简单的矩形,尝试不同的边界变量。我的问题是,为什么前两个工作不正常?它们不会在纸张上打印完整的矩形,只会绘制左侧和顶部。为什么只有第三个打印出一个完整的矩形?我的印象是这三个都应该正常工作。我错过了什么?

这是我的代码:

this.printDocument1.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);

...
private void PrintPage(object sender, PrintPageEventArgs e)
{
    //Method 1, no right and bottom sides are printed
    e.Graphics.DrawRectangle(new Pen(Color.Black, 1), e.PageBounds);

    //Method 2, same as Method 1
    e.Graphics.DrawRectangle(new Pen(Color.Black, 1), e.MarginBounds);

    //Method 3, works correctly
    e.Graphics.DrawRectangle(new Pen(Color.Black, 1), new Rectangle((int)e.Graphics.VisibleClipBounds.X, (int)e.Graphics.VisibleClipBounds.Y, (int)e.Graphics.VisibleClipBounds.Width, (int)e.Graphics.VisibleClipBounds.Height));
}

2 个答案:

答案 0 :(得分:1)

我的第一个猜测是2正在使用您之前设置的边距(0,0,0,0)并且您的打印机实际上不支持无边距打印(大多数不支持)。由于大多数打印机至少需要一些边距,#1几乎不会起作用。

方法3似乎实际上是在查询驱动程序页面的可打印区域,然后使用它,因此,它可以正常工作。

至于为什么你得到#1和#2的顶部和左边而不是什么,这是因为你只是说“从可打印区域的左上角开始打印这些尺寸的矩形”不是“打印出一个具有这些尺寸的矩形,并从页面的左上角开始,你无法实际打印”,所以它正在尝试,但它会超出页面边缘,因为它比可打印区域大页面。

答案 1 :(得分:1)

第一个不起作用,因为你试图打印出边距。第二个失败是因为你试图在边缘上打印,所以右边和底边的边界下降了1个像素。现在第3个工作IMO,因为打印矩形坐标是浮点数,然后将它们转换为整数,从而将它们向下舍入,因此矩形落在打印区域内。

修改 我发现有关您评论的一些其他信息:  “如果Graphics对象使用的是非默认的PageUnit,[2]则VisibleClipBounds将与PageBounds不同(以100 dpi为单位)。为了处理这些变量,使用辅助方法返回”真实的“页面界限以一致的度量单位”

查看this article,我相信它涵盖了所有内容。