2012-02-18 71 views
3

虽然在网上有一些教程,但我仍然为什么不能正确打印多个页面而失去意义。我究竟做错了什么?如何从WinForms打印多个页面?

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

回答

8

你永远不会从环形折返。将其更改为:

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页,而不是再次重新开始我= 0,对当前数字开始。

+0

是的,这是有效的。 一个问题:每当HasMorePages触发标志时,整个函数PrintPage将从开始再次运行? – SubjectX 2012-02-18 15:28:06

+1

e.HasMorePages在函数返回后进行评估(不是在设置时)。如果它是真的,它再次调用该函数。如果它是假的,它不会停止打印。 – thoean 2012-02-18 15:56:58

+0

我现在已经扩展了我的程序,但我又被卡住了,可能是因为同样的原因。我应该问这里还是开新的问题? – SubjectX 2012-02-19 13:24:50