代码之家  ›  专栏  ›  技术社区  ›  Brandi

C#-Bug中的可打印区域?

  •  4
  • Brandi  · 技术社区  · 15 年前

    我对PageSettings.PrintableArea的宽度和高度值有问题。宽度、高度和大小属性声明“获取或设置”这些值。另外,inflate()函数声明根据传入的值更改大小。

    尝试设置高度、宽度或大小时会出现编译器错误:“无法修改'System.Drawing.Printing.PageSettings.PrintableArea'的返回值,因为它不是变量。”。

    为什么我想知道这一点:(有人总是问……)我有一个打印应用程序(C#,WinForm),它在大多数情况下工作得相当好。我可以设置打印机设置和页面设置对象来控制打印对话框的打印机属性中显示的内容。但是,使用Microsoft Office Document Image Writer时,这些设置有时会被忽略,即使显示其他内容,纸张大小也会返回0,0。我真的希望它是所见即所得,只要显示的值去,所以我改变纸张大小回它应该是,但可打印的地区,如果它是错误的,使产生的图像不稳定。生成的图像是可打印区域的大小,而不是papersize中的值。只是想知道这是有原因的还是有办法让它不那么做。

    提前感谢。:)

      //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:

    结论:

    Nobugz在解释为什么PrintableArea不能设置(通常也不需要设置)以及为什么它的inflate()函数被忽略方面做得很好,所以我将其标记为答案。

    至于促使我提出这个问题的那个长期存在的问题,我仍然不知所措。作为对“ScaleTranform”建议的回应,PaperSize和Graphics对象已经有了正确的值,因此搞乱这些值不太可能有帮助。我想,沿着这条路线,我能做的最多的就是将正确大小的图像调整为PrintableArea的垃圾值。当显式设置PaperSize无法相应地修改PrintableArea时,我将假设这是与bug相关的行为。

    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();
    }
    
    3 回复  |  直到 15 年前
        1
  •  7
  •   Hans Passant    15 年前

    复制 价值的一部分。

    编译器会注意到您正试图修改副本的一个成员,就像您试图分配Height属性时一样。但是当您使用Inflate()方法时,它会变得很棘手。你是在夸大副本,而不是原始值,而且编译器也没有足够聪明来注意到这一点。

        2
  •  2
  •   Michael Ball    14 年前

    好吧,我知道这有点老了,所以有问题,但我有同样的问题,并发现如何正确设置纸张大小,使打印区域是正确的,因为这是其中一个出现的几个职位,当我'谷歌'的问题,我想我会加上我是如何让它在这里工作,所以下一个人绊倒了这个问题得到答案。

    下面是一些C#.NET3.5代码,显示了如何将A4和A5大小作为变量,然后根据需要使用,最后一行显示了设置纸张大小时,现在可打印区域将是正确的。

    IEnumerable<PaperSize> paperSizes = settings.PaperSizes.Cast<PaperSize>();
    PaperSize sizeA5 = paperSizes.First<PaperSize>(size => size.Kind == PaperKind.A5);
    PaperSize sizeA4 = paperSizes.First<PaperSize>(size => size.Kind == PaperKind.A4);
    settings.DefaultPageSettings.PaperSize = sizeA5; 
    
        3
  •  1
  •   animuson    13 年前

    我最近能自己想出来。 A) 必须指定“自定义”

    .DefaultPageSettings.PaperSize = New PaperSize("Custom", 1100, 2200)
    

    不起作用:

    .DefaultPageSettings.PaperSize = New PaperSize("Custom", 1093, 2290)