我对 PageSettings.PrintableArea 的宽度和高度值有疑问。Width、Height 和 Size 属性声称可以“获取或设置”这些值。此外,inflate() 函数声称可以根据传入的值更改大小。
然而,所有这些改变价值的尝试都没有奏效。Inflate() 被忽略(没有错误,就像它工作一样通过,但值保持不变。
尝试设置高度、宽度或大小会导致编译器错误:“无法修改 'System.Drawing.Printing.PageSettings.PrintableArea' 的返回值,因为它不是变量”。
我觉得这意味着描述的“或设置”部分是谎言。
为什么我想知道这一点:(总有人问...)我有一个打印应用程序(C#、WinForm),它在大多数情况下都运行良好。我可以设置打印机设置和页面设置对象来控制打印对话框的打印机属性中显示的内容。但是,对于 Microsoft Office Document Image Writer,这些设置有时会被忽略,即使显示其他内容,纸张大小也会返回为 0、0。就显示的值而言,我真正希望它是所见即所得的,所以我将纸张尺寸改回应有的尺寸,但可打印区域,如果它是错误的,会使生成的图像不稳定。生成的图像是可打印区域的大小,而不是纸张大小的值。只是想知道是否有这样做的理由或让它不这样做的方法。
提前致谢。:)
更新:
//ignored
PrintDocument.DefaultPageSettings.PrintableArea.Inflate(XOffset, YOffset);
//causes compiler error
PrintDocument.DefaultPageSettings.PrintableArea.Size = new SizeF((float)DimensionsPaperSize.Width, (float)DimensionsPaperSize.Height);
PrintDocument.DefaultPageSettings.PrintableArea.Height = DimensionsPaperSize.Height;
PrintDocument.DefaultPageSettings.PrintableArea.Width = DimensionsPaperSize.Width;
更新 2:
对于正确打印的(自定义尺寸)打印机,当我更改 PaperSize 时,PrintableArea 和 PageBounds 会自动更改以匹配它。当我在 MDIW 上更改 PaperSize 时,只有 PageBounds 更改。我不明白是什么原因造成的。
结论:
Nobugz 很好地解释了为什么不能设置 PrintableArea(通常永远不需要)以及为什么它的 inflate() 函数被忽略,所以我将其标记为答案。
至于促使我提出这个问题的持续存在的问题,我仍然不知所措。作为对“ScaleTranform”建议的回应,PaperSize 和 Graphics 对象已经有了正确的值,因此弄乱这些值可能没有帮助。我怀疑沿着这条路线我能做的最多就是将我正确大小的图像调整为我为 PrintableArea 获得的垃圾值。当显式设置 PaperSize 无法相应地修改 PrintableArea 时,我将假设这是与错误相关的行为。
令人沮丧的是,我似乎是唯一遇到这个问题的人。至少,到目前为止,我只观察到 MODIW 的这种行为。供任何人参考,因此有尽可能多的信息;我正在运行 32 位 Win7,在 VS2008 中开发。要复制问题,请执行以下步骤:
PrintDialog PrintDlg = new PrintDialog();
PrintDocument PrintDoc = new PrintDocument();
PrintDoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(DocumentPrintPage);
PrintDlg.PrinterSettings.PrinterName = printerName; //MODIW
PrintDoc = AlterPaperSize(PrintDoc); //A function that just changes the papersize
PrintDlg.Document = PrintDoc;
PrintDlg.PrinterSettings = PrintDoc.PrinterSettings;
if (PrintDlg.ShowDialog() == DialogResult.OK)
{
if ((PrintDoc.DefaultPageSettings.PaperSize.Width == 0) &&
(PrintDoc.DefaultPageSettings.PaperSize.Height == 0))
{
PrintDoc.DefaultPageSettings.PaperSize = DimensionsPaperSize;
}
PrintDoc.Print();
}