【问题标题】:How do I print multiple pages from WinForms?如何从 WinForms 打印多个页面?
【发布时间】:2012-03-09 14:55:56
【问题描述】:

虽然网上有一些教程,但我仍然不知道为什么不能正确打印多个页面。我做错了什么?

public static void printTest()
{
   PrintDialog printDialog1 = new PrintDialog();
   PrintDocument printDocument1 = new PrintDocument();

   printDialog1.Document = printDocument1;
   printDocument1.PrintPage += 
       new PrintPageEventHandler(printDocument1_PrintPage);

   DialogResult result = printDialog1.ShowDialog();
   if (result == DialogResult.OK)
   {
       printDocument1.Print();
   }       
}

static void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
   Graphics graphic = e.Graphics;
   SolidBrush brush = new SolidBrush(Color.Black);

   Font font = new Font("Courier New", 12);

   e.PageSettings.PaperSize = new PaperSize("A4", 850, 1100);

   float pageWidth = e.PageSettings.PrintableArea.Width;
   float pageHeight = e.PageSettings.PrintableArea.Height;

   float fontHeight = font.GetHeight();
   int startX = 40;
   int startY = 30;
   int offsetY = 40;

   for (int i = 0; i < 100; i++)
   {             
       graphic.DrawString("Line: " + i, font, brush, startX, startY + offsetY);
       offsetY += (int)fontHeight;

       if (offsetY >= pageHeight)
       {
           e.HasMorePages = true;
           offsetY = 0;
       }
       else {
           e.HasMorePages = false;
       }
   }
}

您可以在此处找到此代码的打印结果示例:Printed Document

【问题讨论】:

    标签: c# winforms printing


    【解决方案1】:

    你永远不会从循环中返回。将其更改为:

    if (offsetY >= pageHeight)
    {
        e.HasMorePages = true;
        offsetY = 0;
        return; // you need to return, then it will go into this function again
    }
    else {
        e.HasMorePages = false;
    }
    

    此外,您需要将循环更改为从第 2 页的当前编号开始,而不是再次以 i=0 重新开始。

    【讨论】:

    • 是的,这行得通。一个问题:每当 HasMorePages 触发标志时,整个函数 PrintPage 将从头开始再次运行?
    • e.HasMorePages 在函数返回后进行评估(而不是在设置时)。如果为真,则再次调用该函数。如果它是假的,它不会并停止打印。
    • 我现在已经扩展了我的程序,但我又卡住了,可能是因为同样的原因。我应该在这里提问还是打开新问题?
    • 你卡在哪里了?如果密切相关,请继续。我无法判断。
    • 你们有没有解决这个问题。我正在尝试做类似的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多