【问题标题】:Why does multi page printing in Windows Forms work the way it does?为什么 Windows 窗体中的多页打印会以这种方式工作?
【发布时间】:2013-04-15 10:29:06
【问题描述】:

由于我们最近学习了如何在 Windows 窗体中打印,我想知道为什么要打印多页,PrintDocument 中的 OnPrintPage(PrintPageEventArgs e) 会为每一页调用并告诉它我有多个页面我必须设置 @ 987654323@ 为真。我想到了多种其他解决方案,例如您可以使用的 Page 对象和返回这些对象数组的 OnPrintPage 方法。

但由于我认为 Microsoft 有充分的理由按照他们的方式实现它,所以我想知道是否有人知道 API 看起来如此的原因。

【问题讨论】:

  • "...OnPrintPage 方法返回这些对象的数组" - 这会增加非常大的文档的内存需求。
  • @Joe 这可能是真的,但它目前的工作方式是否也需要一种存储页面的方法?

标签: c# winforms printing


【解决方案1】:

它只是从根本上映射到 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 forum post 中找到代码。另请注意 C# 迭代器(yield return 语句)如何成为该问题的良好通用解决方案。

【讨论】:

  • 如果 Windows API 看起来像这样,那么以这种方式实现它是有意义的。很高兴您能对这个话题有所了解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
相关资源
最近更新 更多