0

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

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

4

1 回答 1

2

它只是从根本上映射到 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 语句)如何成为该问题的良好通用解决方案。

于 2013-04-15T11:29:14.580 回答