我正在尝试查找打印机上的最大可用区域。我打印了一个简单的矩形,尝试不同的边界变量。我的问题是,为什么前两个工作不正常?它们不会在纸张上打印完整的矩形,只会绘制左侧和顶部。为什么只有第三个打印出一个完整的矩形?我的印象是这三个都应该正常工作。我错过了什么?
这是我的代码:
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));
}
答案 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,我相信它涵盖了所有内容。