Bra*_*ndi 5 c# printing system.printing winforms
我在使用PageSettings.PrintableArea的宽度和高度值时出现问题."宽度","高度"和"大小"属性声称"获取或设置"值.此外,inflate()函数声称根据传入的值更改大小.
但是,所有这些改变价值的尝试都没有奏效.Inflate()被忽略(没有错误,只是传递就像它工作,但值保持不变.
尝试设置高度,宽度或大小会产生编译器错误:"无法修改'System.Drawing.Printing.PageSettings.PrintableArea'的返回值,因为它不是变量".
我觉得这意味着描述的"或设定"部分是谎言.
为什么我想知道这个:(有人总是问...)我有一个打印应用程序(C#,WinForm),对于大多数事情来说工作得相当好.我可以设置打印机设置和页面设置对象来控制打印对话框的打印机属性中显示的内容.但是,使用Microsoft Office Document Image Writer时,这些设置有时会被忽略,即使显示其他内容,纸张大小也会返回0,0.所有我真的希望它是所见即所得到的显示值,所以我将纸张尺寸改回原来应该是,但可打印区域,如果它是错误的,使得结果图像不稳定.生成的图像是可打印区域的大小,而不是paperize中的值.只是想知道是否有理由这样或者不让它做到这一点.
提前致谢.:)
更新:
//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;
Run Code Online (Sandbox Code Playgroud)
更新2:
对于正确打印的我(自定义尺寸)打印机,当我更改PaperSize时,PrintableArea和PageBounds会自动更改以匹配它.当我在MDIW上更改PaperSize时,只有PageBounds会发生变化.我不明白是什么造成的.
结论:
Nobugz做了很好的工作,解释了为什么无法设置PrintableArea(并且通常永远不需要)以及为什么忽略inflate()函数,所以我将其标记为答案.
至于促使我提出这个问题的持续性问题,我仍然不知所措.为了响应'ScaleTranform'建议,PaperSize和Graphics对象已经具有正确的值,因此弄乱这些值可能没有帮助.我怀疑我沿着那条路线做的最多就是将我正确大小的图像调整为我为PrintableArea获取的垃圾值.当明确设置PaperSize无法相应地修改PrintableArea时,我将假设它是与bug相关的行为.
令我感到沮丧的是,我似乎是遇到这个问题的唯一人.至少,到目前为止,我只是观察了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();
}
Run Code Online (Sandbox Code Playgroud)
对于.NET编程来说,这是一个非常基本的问题,每个程序员都至少会遇到一次.PrintableArea属性类型是RectangleF.这是一种结构,一种价值类型.当您使用该属性时,您将获得该值的副本.
编译器会注意到您正在尝试修改副本的成员,就像尝试分配Height属性一样.但是当你使用Inflate()方法时,它会变得愚蠢.您正在膨胀副本,而不是原始值,编译器不够智能,无法注意到.
这里的关键问题是PrintableArea属性只有一个getter,它没有setter.这意味着你无法改变它.如果你考虑它是有道理的,你不能改变纸张的大小,也不能改变打印机的设计.您可能想要使用Margins属性.
| 归档时间: |
|
| 查看次数: |
5763 次 |
| 最近记录: |