【问题标题】:Recommend me a solution for generating print preview and printing推荐我一个生成打印预览和打印的解决方案
【发布时间】:2014-05-31 22:54:18
【问题描述】:

简介及相关资料:

我正在维护一个旧应用程序,我需要实现基于从数据库计算的数据生成报告的功能。用户还必须有打印文件的附加选项(用户必须能够选择打印机,并且必须能够看到打印预览)。

为了提高我得到满意答案的机会,请允许我用一个小的“例子”来说明问题:

  • 用户按下按钮 -> 应用程序计算数据; // 完成

  • 应用程序创建文件并用结果填充它; // 完成

  • 通知用户生成报告; // 完成

  • 用户按下另一个为打印收费的按钮; // 卡在这里!

  • 会弹出打印预览和运行打印对话框的选项。 // 卡在这里

  • 用户启动打印对话框,选择打印机,应用程序打印文件;

应用程序使用原始WinAPI(没有MFC)在C++ 中编码。我正在使用 Windows XP。

问题:

我能够成功使用 OLE 自动化 生成/保存 WordExcel 报告,但我无法创建打印预览 与 Word 将创建的打印预览完全匹配。

如果我使用 OLE 自动化 来显示 Excel 的 打印对话框/打印预览,可能会出现以下问题:

用户可以简单地点击“关闭打印预览”,或者可以简单地关闭打印属性表(见下图)返回到可能会破坏文档数据的文档 .

我的雇主不喜欢这样(他们没有软件工程/开发背景,所以无论我说什么最终都会成为“风中的回声”......)并且他们希望我的打印预览匹配 正是 Word 生成的打印预览。

因此,我需要一种为用户生成打印预览的解决方案,以一种与 Word 将创建的打印预览完全匹配的方式。此外,用户应该能够只能看到 这看起来如何,但无法从我的应用程序中打开文件。用户应该能够选择将打印文件的打印机。

类似于图片中的实现就可以了。

问题:

介绍性说明:

这个问题太广泛了,无法在一篇文章中回答,所以我必须限制自己只寻求建议/一般概念/指向正确的方向。

实际问题:

我在 OLE 自动化Excel / Word 文件方面尽了最大努力,但正如您所见,生成打印预览时存在问题,因此如下问题:

  1. 由于这是我第一次处理此类任务,您能否推荐我处理它的正确方法(当然是一般概念)?

  2. 是否有可能解决我的打印问题(例如将WM_PRINTCLIENT 消息发送到Word / Excel 或类似的东西)?

    李>

备注:

再一次,我意识到这个问题太宽泛了,所以只给我一般概念/指示,这样如果我在某个地方遇到问题,我可以单独发布问题。

我不需要使用 Word / ExcelOLE 自动化,这是我目前的选择。

如果您能推荐更好的解决方案,我将很乐意接受。 我不想使用库。

如果需要更多信息,请询问,我将编辑我的帖子。

【问题讨论】:

  • 您是否考虑过将文档设为只读
  • @Cheersandhth.-Alf:不,我没有,因为我是第一次解决这个问题。如果它是只读的,我将如何填充该文档?还是您的意思是在填充后将其设为只读
  • 我一直在创建文件并填充它之后。
  • @Cheersandhth.-Alf:对不起,我误解了你的评论。但即使在这种情况下,用户也可以通过单击“关闭打印预览”返回文档,这也很危险......
  • “应用程序创建文件并用结果填充它”——文件是否包含纯文本格式的报告? RTF?或数据(CSV,制表符分隔的文本,...)?您愿意自己绘制完整的报告吗?

标签: c++ winapi printing print-preview ole-automation


【解决方案1】:

当用户单击打印按钮时,您需要弹出一个对话框,该对话框将包含一个显示默认打印机预览的控件和三个用于选择另一台打印机、打印和退出的按钮。

预览控件可以是静态控件,WM_PAINT 处理程序将在其中绘制预览(替代方案:提供 html 文本的 Web 浏览器控件或提供 RTF 文本的 RichText 控件,但是您会受到这些控件的功能)。

Quote: 打印预览 是不是很特别。这只是意味着你必须渲染到屏幕上 (或位图)否则您将呈现给打印机 DC 的内容。这 主要意味着使用页面大小,并为 上一页/下一页。

This SO Answer 详细描述了绘制预览所需的工作。

This CodeProject article 有一些简单的打印预览代码;它在简单的 MFC 中,翻译成普通的 C++/WinAPI 应该不会太难。

【讨论】:

  • 如果我自己绘制报告,我将如何将其内容保存到文件中?我不能使用 GDI / GDI+ 在 Excel / Word / PDF / 或我知道的任何其他文件格式中绘图...这是我的问题,文件的内容和打印预览的内容必须是一样。在发布这个问题之前,我已经检查了提交的文章/问题,但还是谢谢你。
  • 如果文件内容需要和预览匹配,我能想到的选项是RTF、HTML或者PDF(不一定是这个顺序),并在你的预览对话框中嵌入相应的查看器控件
  • 据我所知,PDF 需要支付使用他们的 SDK 的费用,而且我也不希望使用库,所以 RTF 或 HTML 是要走的路......不过,我不知道如何实施您的建议(嵌入查看器控件+自动化),但我愿意学习。我会尝试自己寻找教程,以免打扰您,如果我失败了,我会寻求您的帮助。感谢您的帮助。我们将“保持联系”。
  • 我决定尝试自己进行打印预览和打印,并且可能会将报告输出为 RTF 或 HTML。我还没有找到一种将 Word 查看器嵌入到我的窗口客户区的方法(你能推荐我一个吗?)。尽管如此,我还是 +1,我已经奖励了你。感谢您的帮助。最好的问候,直到下一次。
  • 感谢您的赏金!我也在寻找 Word Viewer ActiveX 控件,但似乎只有旧版本的 Office 曾经支持 OLE 嵌入。看起来最好的方法是嵌入一个不可见的 RichEdit 控件,加载 RTF 文本并使用它打印到您的预览 DC,如 here,我的答案中的链接也可能有所帮助。
猜你喜欢
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多