它只是从根本上映射到 Windows 上的打印工作方式。这是基于页面的,打印机驱动程序一次只在一个页面上工作。StartDoc 和 EndDoc 是选择驱动程序并将其关闭的外部 winapi 函数。它们映射到 PrintDocument.BeginPrint 和 EndPrint 事件。
然后,应用程序必须在开始将图形渲染到打印机的设备上下文之前调用 StartPage winapi 函数。它映射到 PrintPage 事件,PrintController 在调用 StartPage 之后立即触发它。当应用程序完成页面渲染后,必须调用 EndPage。当 PrintPage 事件处理程序返回时由 PrintController 完成。这会在后台打印程序中添加一个页面。
设置 e.MorePages = true 只是告诉 PrintController 它需要留在循环中,再次调用 StartPage 并触发 PrintPage 事件。
这会使打印有点痛苦,您必须在 PrintPage 事件调用之间自己维护状态。必须将它们存储在类内的字段中,它们不能是 PrintPage 事件处理程序的局部变量。我已经为 PrintDocument 编写了一个没有此问题的功能替代品,您可以在一个方法中呈现整个文档。使用分隔页面的 FormFeed() 方法。您可以在此MSDN 论坛帖子中找到代码。还要注意 C# 迭代器(yield return 语句)如何成为该问题的良好通用解决方案。