如何使用打印到 PDF 打印机在 MFC 和 CView 中以编程方式打印而不提示输入文件名?



我有一个使用C++,MFC和C++6.0的大型图形程序。 我需要它打印到 PDF,而无需提示用户输入打印机设置和文件名。

我使用CView::OnPrint()使用打印到 PDF 进行打印Microsoft除了用户提示外,它工作正常。

我已经了解了如何在 C# 中使用PrintDocument对象绕过这些提示,但是在 MFC 中使用CView::OnPrint()时如何做到这一点?肯定有办法吗?

我的项目太大了,无法考虑用 C# 重写,我尝试前进到 Visual studio 2005/2010/2019 等但没有成功,因为默认数据结构打包和转换现有数据文件的更改充满了问题,因此解决方案必须是对现有 MFC C++6.0 的补充如果可能的话。

有人可以帮忙吗?

我已经有一段时间没有使用VC++ 6了,所以我从相当遥远的记忆中走出来,但总体思路相当简单。

完整方法

您的视图具有DoPreparePrinting成员函数。默认情况下,这将创建一个CPrintDialog对象,然后调用CPrintDialogDoModal以显示打印设置对话框。最终(但不是在DoPreparePrinting,如果没记错的话(CPrinterDialogCreatePrinterDC将被调用(显然足够(使用用户在对话框中输入的设置为打印机创建 DC。

要绕过该对话框,您可以覆盖DoPreparePrinting。这将接收指向CPrintDialog的指针。由于您不想显示打印对话框,因此显然不会调用其DoModal成员。相反,您将为打印机填充其DEVMODEDEVNAMES结构以及所需的任何设置。然后,当调用CreatePrinterDC时,它将使用您填写的内容而不显示对话框。

我个人的建议是使用调试器下的对话框运行,然后在CPrintDialogDoModal返回后,查看它返回的DEVNAMES结构。您可能不需要它,但是当我第一次必须自己设置它时,我发现DEVNAMES结构有点混乱。DEVMODE更大,可以说更复杂,但我通常只是修改了一些零碎的东西,并将其中的大部分保留为默认值。

简化的方法

如果您只想使用系统的默认打印设置,有一种更简单的方法:您可以覆盖OnPreparePrinting。这将接收一个pInfo参数,该参数是指向CPrintInfo的指针。它有一个m_bDirect成员,您可以将其设置为true进行"直接"打印,它仅使用默认设置而不使用打印机对话框。不过,我不确定何时添加m_bDirect。如果缺少它,则有一个"技巧"可以获得相同的效果:DoPreparePrinting的默认实现不显示打印预览的打印对话框,因此您可以覆盖OnPreparePrinting以将m_bPreview设置为 true,调用DoPreparePrinting,然后将m_bPreview设置回false

最新更新