我在我的应用程序中使用PrintDocument进行一些自定义打印。当我们的项目成功打印时,我需要记录。我最初通过以下方式实现了这个目标:
print_doc.EndPrint += (o,e) => printed_callback ();
在打印完成后调用printed_callback
。但是,现在我正在添加预览支持,我将PrintDocument
以完全相同的方式传递到PrintPreviewDialog。这样做会导致在初始呈现预览所需的打印输出后调用EndPrint
事件。
因此,即使用户点击“预览”然后关闭预览,我们也会调用我们的日志记录代码。
有关如何区分真实打印输出和“预览打印”的任何建议?不幸的是,由于用户可能会点击预览对话框中的“打印”按钮并触发打印输出,因此我不能只为EndPrint
传递给PrintDocument
。PrintPreviewDialog
。
答案 0 :(得分:14)
好的,所以我实际上设法自己解决这个问题,使用PrintDocument.PrintController属性,并检查控制器的IsPreview
属性。我的最终编码最终如下:
doc.EndPrint += (o,e) =>
{
if (doc.PrintController.IsPreview)
return;
print_callback ();
}
答案 1 :(得分:0)
我也设法找出一种对我有用的不同方式......
我有一个MyPrintFileDetail类列表,每个类包含一个PrintDocument和一个用于所述文档的StreamReader。
在设置我的PrintDocument时,我添加了一个PrintPage事件。在PrintPage事件处理程序中,我通过强制转换" sender"来识别我正在使用的PrintDocument。到PrintDocument。然后写了一个foreach循环来从列表中识别工作的MyPrintFileDetail对象,以获取我用来打印的StreamReader。一旦没有要打印的行,我就处理了StreamReader并将其设置为null。
然后在我的Timer回调中处理MyPrintFileDetail对象列表,我检查了StreamReader是否为null,如果为null,我就完成了打印。
有点笨重但有效。
private void PD_PrintPage(object sender, PrintPageEventArgs e)
{
PrintDocument p = (PrintDocument)sender;
PrintFileDetail pfdWorkingOn = null;
foreach (PrintFileDetail pfd in pfds)
{
if (pfd._PrintDoc.DocumentName == p.DocumentName)
{
pfdWorkingOn = pfd;
break;
}
}
float yPos = 0f;
int count = 0;
float leftMargin = e.MarginBounds.Left;
float topMargin = e.MarginBounds.Top;
string line = null;
float linesPerPage = e.MarginBounds.Height / _TextFilePrintingFont.GetHeight(e.Graphics);
while (count < linesPerPage)
{
line = pfdWorkingOn._TxtFileBeingPrinted.ReadLine();
if (line == null)
{
break;
}
yPos = topMargin + count * _TextFilePrintingFont.GetHeight(e.Graphics);
e.Graphics.DrawString(line, _TextFilePrintingFont, Brushes.Black, leftMargin, yPos, new StringFormat());
count++;
}
if (line != null)
{
e.HasMorePages = true;
}
else
{
pfdWorkingOn._TxtFileBeingPrinted.Dispose();
pfdWorkingOn._TxtFileBeingPrinted = null;
}
}