Hasmorepages PrintPageEventArgs 属性究竟做了啥?

Posted

技术标签:

【中文标题】Hasmorepages PrintPageEventArgs 属性究竟做了啥?【英文标题】:What does Hasmorepages PrintPageEventArgs property do exactly?Hasmorepages PrintPageEventArgs 属性究竟做了什么? 【发布时间】:2012-07-17 16:50:52 【问题描述】:

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

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

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

谢谢,

【问题讨论】:

【参考方案1】:

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

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

在打印 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。

【讨论】:

哎呀!我的意思是说 printpageeventargs 不是 printdocument。 理论上应该是这样工作的。显然,在 C# 或 Delphi Prism 中。似乎没有 BeginDoc 或 StartDoc 方法,尽管您指出有 BeginPrint 和 EndPrint。 叹息,正如答案中所指出的,它们是底层的 winapi 调用。【参考方案2】:

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

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

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

ev.HasMorePages := DoYouHaveMorePagesToPrint;

有关事件的 VB.NET 示例以及如何使用ev.HasMorePages,请参阅MSDN documentation for PrintDocument。有关PrintPageEventArgs 的信息,请参阅this MSDN page,其中包含指向members of PrintPageEventArgs(包括HasMorePages)的链接。

【讨论】:

以上是关于Hasmorepages PrintPageEventArgs 属性究竟做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

为 ajax 响应自定义 DataTables 分页

C# printdocument 分页打印