Tag: printdocument

如何find实际的可打印区域? (的PrintDocument)

为什么发现这个神奇的矩形如此困难? 在OnPrintPage事件中,我有PrintPageEventArgs,并试图在最大可打印区域的范围内使用graphics进行绘制。 我已经尝试过使用PageBounds,PrintableArea,Graphics.VisibleClipBounds等等。所有都无法一直得到绘图区域,特别是从横向切换到纵向布局时。 从横向切换到纵向时,PrintableArea似乎不会改变。 我也注意到,如何设置Graphics.VisibleClipBounds是有区别的,如果我正在做一个打印预览和一个实际的打印。 在预览中,它总是显示肖像的宽度/高度,所以我必须检查是否是预览,我必须手动交换宽度/高度时,它是一个景观。 我需要一个algorithm来计算与当前Graphics上下文相关的可打印区域,而不是在实际绘图中不使用的任意理论打印区域。 我关心的是处理graphicsmatrix偏移。 到目前为止,我已经注意到graphics上下文是如何根据如下因素使用硬边缘进行预翻译的严重不一致: 如果OriginAtMargins是真的或假的(不像我想象的那样) 如果我正在打印到打印机,或使用PrintPreviewControl(我必须检查这是预览打印还是打印到页面以正确处理翻译) 如果我在家中使用我的打印机,或者我的打印机在工作(两者行为不同) 有没有一个标准的方法来处理这个? 我应该重置matrix吗? 当我将OriginAtMargins设置为true时,graphics预先翻译为84,84,但我的边际是100,100。 硬边缘是16,16。 不应该把它翻译成100,100吗? 由于0,0应该在页面边界,而不是硬边缘。 基本上我的方法应该总是在获得最好的可打印的矩形。 我只需要一个一致的,独立于设备的方法来确保我的绘图原点(0,0)位于页面的左上angular,以便上面的Rectangle对我有任何用处。

为什么Graphics.MeasureString()返回高于预期的数字?

我正在生成收据,并使用Graphics对象来调用DrawString方法来打印出所需的文本。 graphics.DrawString(string, font, brush, widthOfPage / 2F, yPoint, stringformat); 这工作正常,我需要它做的事情。 我总是知道我打印的是什么,所以我可以手工修剪任何琴弦,使它适合于80mm收据纸。 然后,我不得不添加一些额外的function,这将使这更加灵活。 用户可以传入将被添加到底部的string。 由于我不知道他们要放什么,我只是创build了自己的文字包装函数,它接受了许多字符来包装string本身。 为了找出字符的数量,我做了这样的事情: float width = document.DefaultPageSettings.PrintableArea.Width; int max = (int)(width / graphics.MeasureString("a", font).Width); 现在宽度正在返回给我283,mm为72,这对于80mm纸张的边距是有意义的。 但是MeasureString方法在Courier New 8pt字体上返回10.5。 所以我没有想到36 – 40的时候,我得到26,导致2行文字变成了3-4。 PrintableArea.Width的单位是1/100英寸,graphics对象的PageUnit是Display(它通常是打印机的1/100英寸)。 那为什么我只能拿回26?