2

我试图了解 Hasmorepages PrintPageEventArgs 属性是什么,为什么要使用它以及它是如何工作的。

MSDN Library 并没有很好的解释。他们所说的只是,如果您将其设置为 true,则会再次调用 printpage 事件。这是否意味着事件会自行循环而不离开或离开并再次调用自身或依赖您再次调用 printpage 事件?

我只是想了解 PrintPageEventArgs.hasmorepages 属性。任何提示或帮助将不胜感激。

谢谢,

4

2 回答 2

4

它不是 PrintDocument 的属性,而是 PrintPageEventArgs 的属性。将其实例传递给您的 PrintPage 事件处理程序。

PrintController 和 PrintDocument 类的工作方式很大程度上受 Windows 中实现打印的方式的影响。一个核心实现细节是它是基于页面的。打印机驱动程序一次处理一页,底层的winapi函数是StartPage()。渲染到打印设备上下文的任何内容最终都在一页上。然后 EndPage() winapi 函数完成页面并将其提交给假脱机程序。

在打印 3 页文档时绘制调用图表可能会有所帮助:

StartDoc()
    PrintDocument.BeginPrint event
    StartPage()
       PrintDocument.PrintPage event, e.HasMorePages = true
    EndPage()
    StartPage()
       PrintDocument.PrintPage event, e.HasMorePages = true
    EndPage()
    StartPage()
       PrintDocument.PrintPage event, e.HasMorePages = false
    EndPage()
    PrintDocument.EndPrint event
EndDoc()

现在应该清楚了,通过分配 e.HasMorePage = true,您可以让 PrintController 继续触发 PrintPage 事件。您可以对文档进行分页并在 PrintPage 事件处理程序中呈现正确页面的内容。例如,您需要 BeginPrint 事件将内部页面计数器设置为 0。

于 2012-07-18T17:00:01.113 回答
2

HasMorePagesPrintPageEventArgs您作为事件参数接收的布尔属性。True如果要打印更多页面,或者False如果当前页面是最后一页,则将其设置为在打印当前页面之后。

事件总是由框架中的某些东西为您调用,并且永远不应该由您直接调用。它们是事件,这意味着它们被派去告诉你发生了什么事,并给你一个回应或反应的机会。

如果将其设置为True,则PrintPage自动再次调用该事件;你不叫它自己。(这正是 MSDN 文档所说的:如果您将其设置为 true,则会再次调用printpage 事件。它并没有说您需要再次调用它- 它说再次调用它。)

ev.HasMorePages := DoYouHaveMorePagesToPrint;

有关事件的 VB.NET 示例以及如何使用ev.HasMorePages,请参阅PrintDocument 的 MSDN 文档。有关 的信息PrintPageEventArgs,请参阅此 MSDN 页面,其中包含指向PrintPageEventArgs 成员的链接(包括HasMorePages)。

于 2012-07-18T16:18:11.430 回答