出于某种原因,人们确实对打印富文本控件中的内容感到困惑。
我并非打印方面的专家,但是经过对资料的研究的,我也算弄明白了,今天在此记录一下。
解决问题的关键是这个消息:EM_FORMATRANGE。
每次发送这个消息的时候,控件的内容会打印一些,然后消息会返回尚未打印的文本的首个字符的索引,然后可以依据这个索引继续传递给它,并打印下一块文本内容。
剩下的工作就是简单的设置工作和资源的销毁了。
>> 请移步至 www.topomel.com 以查看图片 <<
我们首先获取页面的尺寸,并使用 EM_SETTARGETDEVICE 消息告诉富文本控件我们打算呈现的内容。接下来,我们需要填写 FORMATRANGE 结构体,为此,我们指定要渲染到的 HDC 以及纸张尺寸。但是字符范围呢?
我们很懒惰,让富文本控件为我们处理它:我们选择所有文本,然后让富文本控件告诉我们刚刚选择的内容,它以 CHARRANGE 的形式返回,这正是我们所需要的。
接下来是打印循环。虽然仍有文本要打印(并且我们没有遇到错误),但我们开始一个新页面,要求富文本控件呈现该页面,记住下一页应该从哪里开始,然后结束当前页面。
请注意,代码中会执行一段检查,以确保富文本控件向前推进。如果没有,那么我们最终会陷入无限循环,打印出空白页!(我不知道这在理论上是否可行,但我同样会防止它。)
打印循环完成后,我们通过发送最后一条 EM_FORMATRANGE 消息来告知富文本控件我们已完成,并且可以丢弃它缓存的信息。
我们可以利用过去几天学到的所有信息来制作一个简单的“打印 RTF”程序。
>> 请移步至 www.topomel.com 以查看图片 <<
我们创建一个富文本控件,并用命令行上传递的文件填充它。然后,我们要求 PrintDlg 函数为我们提供用户默认打印机的 DC。我们给文档一个标题,启动文档,将富文本打印到文档中,然后结束文档(如果在打印过程中出现问题,则中止文档)。稍微清理一下,程序就结束运行了。
一个小小的程序,可以打印任意的RTF文档,没有任何特别难理解的地方。
总结
我有时候真的想将打印功能列为需求列表上最后一行,但是真实世界中,这一功能可能是某一类用户最希望使用的。
所以,还是尽力拥抱你最害怕的事情吧。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《How do I print the contents of a rich text control?》